HDU 1024 Max Sum Plus Plus (dp, 降维)
2017-09-26 19:23
387 查看
题目链接: HDU 1024 Max Sum Plus Plus
题意:
- 给出n个数, 取其中不相交的m个连续序列的累加和,问最大值为多少
构造dp方程
最直观的方程: dp[i][j] = MAX( dp[i-1][j]+a[i], dp[k][j-1]+a[i]) ( 1<=k < i )
其中dp[i][j]表示,在必须取第i个数的前提下,将前i个数分成j段的最大值
数据范围n->[1, 1000000], 而m未知,这种情况下,m稍微大点就会出现爆空间了,所以需要数组降维
在不考虑a[i]的情况下,dp[i][j]只与dp[i-1][j]和MAX(dp[k][j-1]) (1< = k< i ) 有关。故只需要开两个数组,分别记录
① dp[j]记录前i个数分成j段的最大值, (在未更新前i个数分成j-1段的最大值之前, dp[j-1]为将前i-1分成j-1段的最大值)
② dp2[j]记录dp[k][j-1] (1 <= k < i) 的最大值
题意:
- 给出n个数, 取其中不相交的m个连续序列的累加和,问最大值为多少
构造dp方程
最直观的方程: dp[i][j] = MAX( dp[i-1][j]+a[i], dp[k][j-1]+a[i]) ( 1<=k < i )
其中dp[i][j]表示,在必须取第i个数的前提下,将前i个数分成j段的最大值
数据范围n->[1, 1000000], 而m未知,这种情况下,m稍微大点就会出现爆空间了,所以需要数组降维
在不考虑a[i]的情况下,dp[i][j]只与dp[i-1][j]和MAX(dp[k][j-1]) (1< = k< i ) 有关。故只需要开两个数组,分别记录
① dp[j]记录前i个数分成j段的最大值, (在未更新前i个数分成j-1段的最大值之前, dp[j-1]为将前i-1分成j-1段的最大值)
② dp2[j]记录dp[k][j-1] (1 <= k < i) 的最大值
#include<bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back #define fir first #define sec second #define repp(i, a, b) for(int i=(b); i>=(a); --i) #define rep(i,a,b) for (int i=(a); i<=(b); ++i) #define de(x) cout<< #x << " => " << (x) << endl #define ms(a, b) memset(a, b, sizeof(a)) typedef long long ll; typedef pair<int,int> pii; typedef vector<int> vi; const int inf = 0x3f3f3f3f; const double PI=acos(-1); const double eps=1e-9; inline void file_put() { freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); } const int maxn = 1e6+5; int n, m; int a[maxn]; ll dp1[maxn], dp2[maxn]; int main() { // file_put(); while(~scanf("%d %d", &m, &n)){ rep(i, 1, n){ scanf("%d", &a[i]); } ms(dp2, 0); dp1[0]=0; ll ans=-inf*inf; rep(i, 1, m){ ans = -inf*inf; rep(j, i, n){ dp1[j] = max(dp1[j-1]+a[j], dp2[j-1]+a[j]); dp2[j-1] = ans; ans = max(ans, dp1[j]); } } cout << ans <<endl; } return 0; }
相关文章推荐
- A - Max Sum Plus Plus HDU - 1024——基础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)
- 【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-(分组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) 有点小bug?
- 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
- HDU-1024 Max Sum Plus Plus(DP)
- HDU 1024 Max Sum Plus Plus【线性dp】