bzoj1578Stock Market(dp)

每天能獲得的最大錢數只與前一天有關。對於手裏每隻股票,前一天可以買或不買。那麼每一天的收益就取決於前一天有多少錢,怎麼買。我們就可以揹包了,體積爲前一天有的錢數,體積爲該股票前一天的價值,利潤爲今天的價值。

設best[ i ]爲第i天的最大錢數。

#include<stdio.h>
typedef long long ll;
#include<algorithm>
using namespace std;
#define inf 500010
ll d,s,sum;
ll map[55][55];
ll best[55];
ll dp[inf];
ll tmp[55];
ll i,j,k;
int main()
{
	scanf("%lld %lld %lld",&s,&d,&sum);
	for(i=1;i<=s;i++)
	{
		for(j=1;j<=d;j++)
		{
			scanf("%lld",&map[j][i]);
		}
	}
	best[1]=sum;
	for(i=2;i<=d;i++)
	{
		ll tot=0;
		for(j=1;j<=s;j++)
		{
			if(map[i][j]>map[i-1][j])
			{
				tmp[++tot]=j;
			}
		}
		for(k=1;k<=best[i-1];k++)
		{
			dp[k]=k;
		}
		for(j=1;j<=tot;j++)
		{
			for(k=map[i-1][tmp[j]];k<=best[i-1];k++)
			{
				dp[k]=max(dp[k],dp[k-map[i-1][tmp[j]]]+map[i][tmp[j]]);
			}
		}
		best[i]=max(best[i],dp[best[i-1]]);
	}
	printf("%lld",best[d]);
}


發佈了59 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章