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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM