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;
}
hdu 1078记忆化搜索
最新推荐文章于 2018-12-07 22:47:40 发布
本文介绍了一种使用记忆化搜索解决动态规划问题的方法,通过递归与缓存技术优化了复杂度,实现了高效求解。具体步骤包括定义状态、转移方程以及初始化边界条件,最终通过实例演示了如何在C++中实现这一解决方案。

493

被折叠的 条评论
为什么被折叠?



