当前位置: 代码迷 >> 综合 >> HDU 1024 Max Sum Plus Plus(求m个不相交连续子序列最大和/01背包)
  详细解决方案

HDU 1024 Max Sum Plus Plus(求m个不相交连续子序列最大和/01背包)

热度:99   发布时间:2023-12-08 11:03:36.0

题目链接:
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]);
但是这样做有一个问题–数组太大,但是可以用滚动数组的方法解决。
注意

  相关解决方案