HDU 1024 (不重叠m段最大和) Max Sum Plus Plus
2014-08-20 19:33
323 查看
题解是看的这里的:
http://www.acmerblog.com/hdu-1024-Max-Sum-Plus-Plus-1276.html
当前这个状态是dp[i][j],i 表示当前的段,j表示前j个数组成了当前的这i个段的最大值,而且a[j]在最后一个段中
状态dp[i][j]可以从dp[i][j-1]转移过来,表示第j个数字正好可以和 i 个段的前j-1个数字相加的和是当前所在状态中最大的
状态dp[i][j]可以从dp[i-1][j-1]转移过来,表示第 j 个数字正好可以成为第 i 个段,并且使得和i-1个段相加的和是当前所有状态中最大的
注意在第26行和第30行代码更新dp以后,其含义变成前i个段前j个数构成和的最大值,而a[j]并不一定要在这些段中,反正从这个状态转移过去的时候a[j+1]自成一段,与a[j]无关
最最头疼的就是DP过程中状态的含义会发生变化,Orz
现在看来kuangbin大神说的到清楚一些,不过他的代码的变量命名方式是在不敢恭维,=_=||
http://www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html
代码君
http://www.acmerblog.com/hdu-1024-Max-Sum-Plus-Plus-1276.html
当前这个状态是dp[i][j],i 表示当前的段,j表示前j个数组成了当前的这i个段的最大值,而且a[j]在最后一个段中
状态dp[i][j]可以从dp[i][j-1]转移过来,表示第j个数字正好可以和 i 个段的前j-1个数字相加的和是当前所在状态中最大的
状态dp[i][j]可以从dp[i-1][j-1]转移过来,表示第 j 个数字正好可以成为第 i 个段,并且使得和i-1个段相加的和是当前所有状态中最大的
注意在第26行和第30行代码更新dp以后,其含义变成前i个段前j个数构成和的最大值,而a[j]并不一定要在这些段中,反正从这个状态转移过去的时候a[j+1]自成一段,与a[j]无关
最最头疼的就是DP过程中状态的含义会发生变化,Orz
现在看来kuangbin大神说的到清楚一些,不过他的代码的变量命名方式是在不敢恭维,=_=||
http://www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html
//#define LOCAL #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1000000 + 10, INF = (1 << 30); int dp[2][maxn], a[maxn], m, n; int main(void) { #ifdef LOCAL freopen("1024in.txt", "r", stdin); #endif while(scanf("%d%d", &m, &n) == 2) { int i, t; memset(dp, 0, sizeof(dp)); for(i = 1; i <= n; ++i) scanf("%d", &a[i]); for(i = 1, t = 1; i <= m; ++i, t = 1 - t) { dp[t][i] = dp[1-t][i-1] + a[i]; dp[1-t][i] = max(dp[1-t][i], dp[1-t][i-1]); for(int j = i + 1; j <= n - m + i; ++j) { dp[t][j] = max(dp[t][j-1], dp[1-t][j-1]) + a[j]; dp[1-t][j] = max(dp[1-t][j], dp[1-t][j-1]); //此次更新以后dp[1-t][j]存放的是前j个数分成i-1段的最大值,并不要求a[j]在其中 } } int ans = -INF; for(i = m; i <= n; ++i) ans = max(ans, dp[m&1][i]); printf("%d\n", ans); } return 0; }
代码君
相关文章推荐
- hdu 1024 Max Sum Plus Plus 最大m子段和
- !HDU 1024 Max Sum Plus Plus-dp-(分组dp?最大分段子序列和)
- HDU 1024 Max Sum Plus Plus求前n个数中的若干个数分为连续的m段的最大和值(解析)
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- HDU 1024 Max Sum Plus Plus[dp](最大m子段和)
- hdu 1024 Max Sum Plus Plus(DP最大字段和)
- Max Sum Plus Plus---hdu1024(动态规划求M段的最大和)
- HDU 1024 Max Sum Plus Plus(动态规划,给定一个数组,求其分成m个不订交子段和最大值的题目)
- hdu 1024 Max Sum Plus Plus(动态规划+m子段和的最大值)
- hdu 1024 Max Sum Plus Plus 一串数字中,m段连续数字最大和 滚动数组+dp
- HDU 1024 Max Sum Plus Plus(最大M子段和)
- hdu 1024 Max Sum Plus Plus(最大m子段和)
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
- hdu 1024 Max Sum Plus Plus(dp && 最大m子段和)
- hdu 1024 Max Sum Plus Plus m段连续子序列最大和 dp
- hdu 1024 Max Sum Plus Plus(最大m字段和)
- HDU 1024 Max Sum Plus Plus最大m子段和
- hdu 1024 Max Sum Plus Plus(DP最大字段和)
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和