算法分析:dp记忆化搜索+dfs
记忆化搜索:也称备忘录方法,是动态规划算法的变形,他用二维数组保存已经解决的子问题答案,下次解决此子问题的时候只要简单查看一下就好而不需要重新计算
#include<iostream>
using namespace std;
int grad[100][100],result[100][100];
int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int n,m;
int Search(int x,int y)
{
int ty,tx;
int maxs=0;
//大于0说明搜索过了,直接返回结果即可
if(result[x][y]>0)
return result[x][y];
for(int i=0;i<4;i++)
{
for(int h=1;h<=m;h++)
{
tx=x+next[i][0]*h;
ty=y+next[i][1]*h;
if(tx<0||tx>n||ty<0||ty>n)
continue;
if(grad[x][y]<grad[tx][ty])
{
int temp=Search(tx,ty);
if(maxs<temp)
maxs=temp;
}
}
}
result[x][y]=grad[x][y]+maxs;
return result[x][y];
}
int main()
{
int i,j;
int ans;
while(cin>>n>>m)
{
if(m==-1&&n==-1)
break;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>grad[i][j];
result[i][j]=0;
}
}
ans=Search(0,0);
cout<<ans<<endl;
}
return 0;
}