Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

【新】最传统的动态规划算法,为了防止空间不足,隔若干层进行一次覆盖

Posted by mingruoyuan at 2010-06-28 22:05:39 on Problem 3624
动态转移方程: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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator