DP的边界条件真的烦啊…
当然还有细节,代码里看吧
#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;
}