codeforces D. Yet Another Subarray Problem(DP)

 题目链接:

题意:给一个长度为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;
}

猜你喜欢

转载自www.cnblogs.com/aaddvvaanntteezz/p/11233409.html