解题思路:
这是求不想见子段最大和。
dp[i][j]:前j个数分成i组的最大和。
本题的解题策略是:
第j个数单独成一组,还是和前面前面的数成一组
dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) 0<k<j;
实现代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAXN=1000010; const long long INF=1E40; long long dp[MAXN],mm[MAXN]; long long a[MAXN]; int main(){ int n,m; while(scanf("%d%d",&m,&n)!=EOF){ for(int i=1;i<=n;i++) scanf("%lld",&a[i]); memset(dp,0,sizeof(dp)); memset(mm,0,sizeof(mm)); long long maxSum=0; for(int i=1;i<=m;i++){ maxSum=-INF; for(int j=i;j<=n;j++){ dp[j]=max(dp[j-1]+a[j],mm[j-1]+a[j]); mm[j-1]=maxSum; maxSum=max(maxSum,dp[j]); } } cout<<maxSum<<endl; } }