| ||||||||||
| 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