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