记忆化搜索 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值