创建网站的公司,wordpress 4.8.1漏洞,个人律师网站模板,网站开发 访问速度慢Max Sum Plus Plus HDU - 1024 题意大致是说给你你个序列#xff0c;把它划分成不相交的几个连续的部分#xff0c;然后把这个几个部分求和#xff0c;求出和的最大值。
我们定义子结构 dp[i][j] 表示的是从前j个元素#xff0c;划分成i段所得的最大和。
则我们可以得到… Max Sum Plus Plus HDU - 1024 题意大致是说给你你个序列把它划分成不相交的几个连续的部分然后把这个几个部分求和求出和的最大值。
我们定义子结构 dp[i][j] 表示的是从前j个元素划分成i段所得的最大和。
则我们可以得到转移方程。
考虑最后一个元素
1当最后一个元素自成一组
dp[i][j] 由 max{ dp[i-1][k] a[i] } 转移而来
2当最后一个元素与前一个元素连起来成一组
dp[i][j] 由 dp[i][j-1] a[i]转移而来 但这样的话空间复杂度为O(n2)显然是不够的因此要用滚动数组来优化
时间复杂度为O(n3)也是不够的也需要优化其实转移方程1里的最大值可以用一个数组维护起来 #include cstdio.
#include cstring
#include algorithm
using namespace std;
int a[1000000];
int sum[1000000];
int dp[2][1000000];
int mx[2][1000000];
main(){int m,n;while(scanf(%d%d,m,n) ! EOF){memset(dp,0,sizeof(dp));for(int i 0;i n;i){mx[0][i] 0;mx[1][i] -1e9;}for(int i 0;i n;i){scanf(%d,a[i]);sum[i] i ! 0 ? a[i] sum[i-1]:a[i];}for(int i 1;i m;i){mx[i1][i-1] -1e9;dp[i1][i-1] sum[i-1];mx[i1][i-1] max(mx[i1][i-1],dp[i1][i-1]);for(int j i;j n;j){dp[i1][j] max(dp[i1][j-1] a[j],mx[(i-1)1][j-1] a[j]);mx[i1][j] max(mx[i1][j-1],dp[(i1)][j]);}}int ans -1e9;for(int i m-1;i n;i){ans max(ans,dp[m1][i]);}printf(%d\n,ans); }
}