梦,才是最真的现实

导航

记忆化搜索 HDU 1158

效率很低,本来半个小时可以搞定的题目,结果花了2个多小时

DP不会,继续记忆化搜索,虽然效率和递推的DP差了8倍,但是思路应该不会差距太大吧?

#include<stdio.h>
#include<string.h>
int visited[12][100005];
int month,hire,fire,salary,need[13];
int dfs(int ,int );
int main()
{
	int i,lowest;
	while(scanf("%d",&month)&&month)
	{
		memset(visited,-1,sizeof(visited));
		scanf("%d %d %d",&hire,&salary,&fire);
		for(i=0;i<month;i++)
			scanf("%d",&need[i]);
		lowest=need[0]*(salary+hire)+dfs(1,need[0]);
		printf("%d\n",lowest);
	}
	return 0;
}
int dfs(int now,int num)
{
	int i,k1,k,k3,max;
	if(now==month)
		return 0;
	k1=k=k3=max=0x7fffffff;
	if(visited[now][num]!=-1)
	{
	/*	printf("visited!!!\n");*/
		return visited[now][num];
	}
	if(need[now]>=num)
		k1=hire*(need[now]-num)+salary*need[now]+dfs(now+1,need[now]);
	else
	{
		for(i=0;i<=num-need[now];i++)
		{
		/*	printf("fire!\n");*/
			k=(num-i)*salary+i*fire+dfs(now+1,num-i);
			if(k<k3) k3=k;
		}
	}
	max=k1<k3?k1:k3;
	visited[now][num]=max;
/*	printf("NOW:%d    nun:%d     max:%d\n",now,num,max );*/
	return max;
}


posted on 2012-06-20 01:45  梦,才是最真的现实  阅读(147)  评论(0编辑  收藏  举报