HDU 1078 FatMouse and Cheese

本文介绍了一种使用记忆化搜索解决特定类型问题的方法,并通过一个示例程序详细展示了该算法的具体实现过程。代码中利用了二维数组进行状态记录,防止重复计算,以此提高搜索效率。

题目地址:点击打开链接

思路:记忆化搜索

AC代码:

#include<iostream>
#include<cstring>

using namespace std;

int a[100][100],b[100][100],n,k;
int x[4] = {-1,1,0,0}, y[4] = {0,0,-1,1};

bool check(int l,int m)
{
	if(l <0 || l>=n || m<0 || m>=n)
		return false;
	return true;
}

int dfs(int l,int m)
{
	if(b[l][m])
		return b[l][m];
	int i,j,max = 0,ans,ll,mm;
	for(i=1; i<=k; i++)//控制走的步数,不能从0开始,会陷入死循环,从0开始也没有意义
	{
		for(j=0; j<4; j++)
		{
			ll = l + i * x[j];
			mm = m + i * y[j];
			if(check(ll,mm) && a[ll][mm] > a[l][m])
			{
				ans = dfs(ll,mm);
				if(ans > max)
					max = ans;
			}
		}
	}
	b[l][m] = a[l][m] + max;
	return b[l][m];
}

int main()
{
	int i,j,sum;
	while(cin>>n>>k)
	{
		sum = 0;
		if(n == -1 && k == -1)
			break;
		memset(b,0,sizeof(b));
		for(i=0; i<n; i++)
		{
			for(j=0; j<n; j++)
			{
				cin>>a[i][j];
			}
		}
		sum = dfs(0,0);
		printf("%d\n",sum);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值