题目链接:
HDU 1024 Max Sum Plus Plus
题意:
n个数,求m个不相交连续子序列的最大和。n<=1e6,单个数[-32768,32767],m>0.
分析:
dp[i][j][1]表示在求前i个数的j个不相交的最大子序列和时不要第i个数
dp[i][j][0]表示要第i个数。
*初始化:*
dp为-INF,但是dp[0][0][0]=dp[0][0][1]=0;
*状态转移方程:*
如果第i个数要:
考虑第i-1个数要不要,如果要的话,将第i个数合并进第i-1个数所属于的第j个子序列(dp[i-1][j][0])或者第i个数独自成为第j个子序列(dp[i-1][j-1][0]),
如果不要,那么第i个数独自成为第j个子序列(dp[i-1][j-1][1])
即:dp[i][j][0]=max(max(dp[i-1][j][0],dp[i-1][j-1][0]),dp[i-1][j-1][1])+data[i];
如果第i个数不要:dp[i][j][1]=max(dp[i-1][j][0],dp[i-1][j][1]);
但是这样做有一个问题–数组太大,但是可以用滚动数组的方法解决。
注意:
这道题没指定m的范围,但是亲测1000多一点!因为下面代码中我一开始定义MAX_M是1000,结果WA了好久,改成1010居然AC了!!!!还有数据可能很极端,所以初始化的-INF要尽可能小,dp数组用long long。
HDU 1024 Max Sum Plus Plus(求m个不相交连续子序列最大和/01背包)
最新推荐文章于 2025-02-12 17:39:45 发布
该博客介绍了如何解决HDU 1024问题,即在n个整数中找到m个不相交连续子序列的最大和。通过使用动态规划(dp)和01背包策略,博主分析了状态转移方程,并指出当处理大数据时需要采用滚动数组优化空间。特别地,博主提醒注意数据范围的不确定性以及初始化dp数组时应使用足够小的负无穷值。

最低0.47元/天 解锁文章
786

被折叠的 条评论
为什么被折叠?



