[2020.12.09周三]dp A题

[2020.12.09周三]dp A题

题意:问一个序列被分成m段不相交的段后这m段求和,问求和最大值。

题意:\(dp[i][1]表示算上当前这个数,被分成i段的最大和;\)

\(上当前这个,被分成i段的最大和。\)

注意点:

很简单一道题被我做成了怎么过也过不去的题,原因是inf开小了,之前开0x3f3f3f3f.

我果然不擅长写动态规划的细节。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+100; 
const ll inf=1e18;
ll a[maxn];
ll dp[maxn][2];
int main()
{
    int m,n;
    while(cin>>m>>n)
    {
        for(int i=0;i<=n;i++) dp[i][0]=dp[i][1]=-inf;
        for(int i=1;i<=n;i++) cin>>a[i];
        dp[1][1]=a[1];
        for(int i=2;i<=n;i++){
           for(int j=min(m,i);j>=2;j--){
               dp[j][0]=max(dp[j][1],dp[j][0]);
               dp[j][1]=max(dp[j][1]+a[i],max(dp[j-1][0],dp[j-1][1])+a[i]);
           }
           dp[1][0]=max(dp[1][1],dp[1][0]);
           dp[1][1]=max(a[i],a[i]+dp[1][1]);
        }  
        cout<<max(dp[m][0],dp[m][1])<<endl;
    }
}
posted @ 2020-12-09 17:01  zx0710  阅读(55)  评论(0编辑  收藏  举报