一个记忆化搜索的题目,参考了网上的代码才写出来的。
dfs(x,y)表示从x,y开始走的话最大的结果是多少。每一次搜索上下左右k步中 最大的那一个 还有一点dp的思想。dp数组用来记录结果,并且防止重复判断。

#include<iostream>
#include<cstring>

using namespace std;

const int maxn = 110;
int G[maxn][maxn];
int dp[maxn][maxn];
int dir[4][2]={0,1,0,-1,1,0,-1,0};//一个表示方向的数组
int n,k;
int dfs(int a,int b)
{
    int ans = 0;
    if(!dp[a][b])
    {
        for(int i = 1 ; i <= k ; i++)
        {
            for(int j = 0 ; j < 4 ; j++)
            {
                int x=a+dir[j][0]*i,y=b+dir[j][1]*i;//xy是要遍历的坐标
                if(x>=0&&x<n&&y>=0&&y<n)
                {
                    if(G[x][y]>G[a][b])
                    {

                        ans = max(ans,dfs(x,y));
                    }
                }
            }
        }
        dp[a][b]=ans+G[a][b];
    }
    return dp[a][b];

}
int main()
{
    while(cin>>n>>k&&!(n==-1&&k==-1))
    {
        memset(G,0,sizeof(G));
        memset(dp,0,sizeof(dp));
        for(int i = 0 ; i < n ; i++)
        {
            for(int j = 0; j < n ; j++)
            {
                cin >> G[i][j];
            }
        }
        dfs(0,0);
        cout<<dp[0][0]<<endl;
    }
    return 0;
}