質問は意図され:nおよびm、kの配列の長さ、およびに最大値。
溶液:M jの残りの部分の最大長さの値と、i番目の代表点右用DP実際、DP [I] [j]を検討してください。
転写式:DP [I] [j]はDPを= [I-1] [J-1] + [I](J> 0)
DP [I] [J] = MAX(DP [I-1] [M-1] + [I] -k、[I] -k)(j == 0)
コード:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=3e5+5; ll dp[maxn][12]; ll a[maxn]; int main() { ll n,m,k; cin>>n>>m>>k; for(int i = 1;i <= n;++i) scanf("%lld",&a[i]); for(int i = 0;i <= n;++i) for(int j = 0;j <= 10;++j) dp[i][j]=-1e18; dp[0][m-1]=0; ll ans=0; for(int i = 1;i <= n;++i) { for(int j = 0;j <= m-1;++j) { if(j==0) dp[i][j]=max(dp[i-1][m-1]+a[i]-k,a[i]-k); else dp[i][j]=dp[i-1][j-1]+a[i]; ans=max(ans,dp[i][j]); } } printf("%lld\n",ans); return 0; }