hdu 1078记忆化搜索

本文介绍了一种使用记忆化搜索解决动态规划问题的方法,通过递归与缓存技术优化了复杂度,实现了高效求解。具体步骤包括定义状态、转移方程以及初始化边界条件,最终通过实例演示了如何在C++中实现这一解决方案。
s[i][j]表示i,j处的最大值,

s[i][j] = {s[i-k][j],s[i+k][j],s[i][j-k],s[i][j+k]}+ a[i][j]

用记忆化搜索,解为s[0][0]

#include <iostream> 
#include <cmath>
#include <cstring>
using namespace std;

int n,k;
int s[101][101];
int a[101][101];

int dirX[4] = {-1,0,1,0};
int dirY[4] = {0,1,0,-1};

int DP(int x,int y)
{
	int sum;
	int max1 = 0;
	if(s[x][y] > 0)
		return s[x][y];
	for(int i = 1; i <= k; i++)
	{
		for(int j = 0; j < 4; j++)
		{
			int xx = x + dirX[j]*i;
			int yy = y + dirY[j]*i;
			if(xx >= 0 && xx < n && yy >= 0 && yy < n && a[xx][yy] > a[x][y])
			{
				sum = DP(xx,yy);
				max1 = max(sum,max1);
			}
		}
	}
	s[x][y] = max1 + a[x][y];
	return s[x][y];
}


int main()
{	

	while(cin>>n>>k)
	{
		if(n == -1 && k == -1)
			break;
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				cin>>a[i][j];
			}
		}

		memset(s,0,sizeof(s));

		int ans = DP(0,0);
		cout<<ans<<endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值