【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; }
相关文章推荐
- hdu-1024-Max Sum Plus Plus-DP
- hdu 1024 Max Sum Plus Plus m段连续子序列最大和 dp
- !HDU 1024 Max Sum Plus Plus-dp-(分组dp?最大分段子序列和)
- HDU 1024 Max Sum Plus Plus(DP,)
- Hdu 1024 Max Sum Plus Plus (dp)
- HDU 1024 Max Sum Plus Plus (DP·滚动数组)
- HDU 1024 Max Sum Plus Plus(dp最大m子段和)
- hdu 1024 Max Sum Plus Plus DP
- HDU 1024 Max Sum Plus Plus【DP+优化时间复杂度】
- Max Sum Plus Plus-HDU1024(dp)
- hdu 1024 Max Sum Plus Plus (dp优化)
- HDU 1024 Max Sum Plus Plus[dp](最大m子段和)
- hdu 1024 Max Sum Plus Plus (DP)
- HDU 1024 Max Sum Plus Plus DP中的经典
- hdu 1024 Max Sum Plus Plus(dp && 最大m子段和)
- hdu 1024 Max Sum Plus Plus dp
- hdu 1024 Max Sum Plus Plus(DP最大字段和)
- hdu 1024 Max Sum Plus Plus--DP
- HDU 1024 Max Sum Plus Plus 经典 DP
- HDU---1024-Max Sum Plus Plus(DP)