D. Yet Another Subarray Problem(dp,状态是难点)

DP的边界条件真的烦啊…

m k 注意到区间长度每增加m就减去k

d p [ i ] [ j ] i , m j 所以令dp[i][j]为以i右端点,区间长度模m余j的最大花费

j = 1 , j = 0 , k 当j=1时,从上一个状态的j=0转移而来,此时需要减去k

k 一般情况不需要减去k

当然还有细节,代码里看吧

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=3e5+10;
int n,m,k,a[maxn],dp[maxn][11],ans;
signed main()
{
	cin >> n >> m >> k;
	for(int i=1;i<=n;i++)	cin >> a[i];
	for(int i=0;i<=n;i++)
	for(int j=0;j<m;j++)
		dp[i][j]=-1e18;
	for(int i=1;i<=n;i++)
	for(int j=0;j<=m-1;j++)
	{
		if( j==1 || m==1 )//m=1时,只选当前一个也要减去k,这个特别坑 
			dp[i][j]=max( dp[i-1][0],(int)0 )+a[i]-k;
		else if( j==0 )	dp[i][j]=dp[i-1][m-1]+a[i];
		else	dp[i][j]=dp[i-1][j-1]+a[i];
		ans=max(ans,dp[i][j]);
	}
	cout << ans;	
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107745253