題意:給一個長度為n和m,k的數組,的最大值。
題解:考慮dp的做法,dp[i][j]代表以第i個數為右端點,長度減一求余m的值為j時的最大值。
轉移方程:dp[i][j]=dp[i-1][j-1]+a[i](j>0)
dp[i][j]=max(dp[i-1][m-1]+a[i]-k,a[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; }