您的位置:首页 > 其它

【dp】HDU 1024 Max Sum Plus Plus

2017-02-19 20:35 393 查看
/*
基础dp
A - Max Sum Plus Plus
时间: 2017/02/18
题意:在一组数取出m个不相交的区间,使区间和的总和最大。
题解:dp[i][j]表示前i个数取第i个数,分为j个区间和的总和最大的值
dp[i][j] = max(dp[i-1][j]+a[i], max(dp[0……(i-1)][j-1])+a[i]);
因为dp[i][j]只和dp[][j-1]和dp[i-1][j]有关,所以只需一维数组即可
max(dp[0……(i-1)])可以在i-1层的时候处理出来,优化时间。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define E 2.71828
#define MOD 1000000007
#define N 1000010
#define M 10010
const double eps=1e-8;

int a
,dp
,maxn
;
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
memset(maxn,0,sizeof(maxn));
int maxnn;
for(int i = 1; i <= m; i++)
{
maxnn = -INF;
for(int j = i; j <= n; j++)
{
dp[j] = max(dp[j-1],maxn[j-1])+a[j];
maxn[j-1] = maxnn;
maxnn = max(maxnn,dp[j]);
}
//printf("\n%d\n",maxnn);
}
printf("%d\n",maxnn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: