BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #2980同步于 2006/10/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

[合集] 从n个数选出m段不相交的连续子序列,使他们和最大

buptacm
2006/10/29镜像同步0 回复
☆─────────────────────────────────────☆ dby (Soso) 于 (Mon Jul 31 21:26:26 2006) 提到: 以前只会O(n^3)的,今天发现O(n^2)也行 3维状态,dp[i][j][k]; i - 前 i 个数; j - 前 i 个数分成 j 段; k- 只有2个状态(0,1),表示最后一个数选没选。 方程根据上边的状态构造一下就ok了~ ☆─────────────────────────────────────☆ sunmoonstar (秀) 于 (Mon Jul 31 21:57:44 2006) 提到: 哪个题? ☆─────────────────────────────────────☆ sunmoonstar (秀) 于 (Mon Jul 31 22:00:39 2006) 提到: 写个方程吧, 这个状态早就想到了, 但是没想出方程 ☆─────────────────────────────────────☆ xiaoming (月下明) 于 (Mon Jul 31 22:01:32 2006) 提到: 这是不是算法书在介绍DP的时候就写了吗 ☆─────────────────────────────────────☆ sunmoonstar (秀) 于 (Mon Jul 31 22:04:58 2006) 提到: 哦,我没看过,哪一本? ☆─────────────────────────────────────☆ xiaoming (月下明) 于 (Mon Jul 31 22:09:33 2006) 提到: dp[i][j]=max{dp[i-1][j],dp[i-1][j-1]+a[i]}不记得了,好象是这样吧 ☆─────────────────────────────────────☆ xiaoming (月下明) 于 (Mon Jul 31 22:16:52 2006) 提到: 好像是dp[i][j]=max{dp[i-1][j],dp[i-1][j]+a[i],dp[i-1][j-1]+a[i]};意思是,最个元素要不不加,要不加在前边第J组,要不就自己变成第J组 ☆─────────────────────────────────────☆ sunmoonstar (秀) 于 (Mon Jul 31 22:26:59 2006) 提到: 似乎这样子, 哪本书上? ☆─────────────────────────────────────☆ xiaoming (月下明) 于 (Mon Jul 31 22:29:37 2006) 提到: 我在九一二的时候看到的。在最后一排最左边那里有一个算法书好像叫算法与程式设计 ☆─────────────────────────────────────☆ dby (Soso) 于 (Mon Jul 31 23:13:35 2006) 提到: 昨天月赛的D题 【 在 sunmoonstar 的大作中提到: 】 ☆─────────────────────────────────────☆ dby (Soso) 于 (Mon Jul 31 23:14:27 2006) 提到: 懒得写了,贴代码吧 INF=-1000000000; for (int i=0;i<=n;i++) for (int j=0;j<=m;j++) dp[i][j][0]=dp[i][j][1]=INF; dp[0][0][0]=0; for (int i=0;i<n;i++) for (int j=0;j<=m;j++) { if (dp[i][j][0]!=INF) { if (j<m && dp[i][j][0]+num[i+1]>dp[i+1][j+1][1]) dp[i+1][j+1][1]=dp[i][j][0]+num[i+1]; if (dp[i][j][0]>dp[i+1][j][0]) dp[i+1][j][0]=dp[i][j][0]; } if (dp[i][j][1]!=INF) { if (j<m && dp[i][j][1]+num[i+1]>dp[i+1][j+1][1]) dp[i+1][j+1][1]=dp[i][j][1]+num[i+1]; if (dp[i][j][1]+num[i+1]>dp[i+1][j][1]) dp[i+1][j][1]=dp[i][j][1]+num[i+1]; if (dp[i][j][1]>dp[i+1][j][0]) dp[i+1][j][0]=dp[i][j][1]; } } int Max=dp[n][m][0]>dp[n][m][1]?dp[n][m][0]:dp[n][m][1]; 【 在 sunmoonstar 的大作中提到: 】 ☆─────────────────────────────────────☆ dby (Soso) 于 (Mon Jul 31 23:17:12 2006) 提到: 思想是这样,但是2维无法记录当前最后1个数是不是选了,下一个数是合并到同一段还是新增一段不好判断 【 在 xiaoming 的大作中提到: 】
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。