Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
【新】最传统的动态规划算法,为了防止空间不足,隔若干层进行一次覆盖动态转移方程:dp[i][j]=max{dp[i-1][j],dp[i-1][j-w[i]]+d[i]} 一般的算法是: for(i=1;i<=n;++i) for(j=1;j<=m;++j) { dp[i][j]=dp[i-1][j]; if(j>=w[i]&&dp[i-1][j]<dp[i-1][j-w[i]]+d[i]) dp[i][j]=dp[i-1][j-w[i]]+d[i]; } 然而提交之后会发现空间不足,为了解决这个方法,必须节省空间。 根据动态转移方程,其中第i层的内容只和第i-1层有关,那么实质上只要2*m的空间就可以办到了,当然,那样前后覆盖比较浪费时间,所以可以每隔若干层进行一次覆盖。 算法是: k=0; while(n>500) { for(i=1;i<501;++i) for(j=1;j<=m;++j) { dp[i][j]=dp[i-1][j]; if(j>=w[i+k]&&dp[i-1][j]<dp[i-1][j-w[i+k]]+d[i+k]) dp[i][j]=dp[i-1][j-w[i+k]]+d[i+k]; } for(j=1;j<=m;++j) dp[0][j]=dp[500][j]; n-=500; k+=500; } 然后再把剩下的小于500的内容dp完就OK。 注意这里的k的值。 另外,500这个数字可以随便选取,只要使空间不爆就行。 似乎那个滚动数组和我的思路有些相像吧?那玩意我不明白,嘿嘿。 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator