方法:记忆化搜索即可
#include <iostream> #include "stdio.h" #include "stdlib.h" #include "string.h" #include "algorithm" #include <queue> #define N 1800000 using namespace std; int n,k; int ss[105][105]; int dp[105][105]; int dir[4][2]={1,0,-1,0,0,1,0,-1}; int isin(int x,int y) { return x>=0&&x<n&&y>=0&&y<n; } int dfs(int x,int y) { int ans=0; if(dp[x][y]) return dp[x][y]; for(int i=1;i<=k;i++) for(int j=0;j<4;j++) { int tempx=x+dir[j][0]*i; int tempy=y+dir[j][1]*i; if(!isin(tempx,tempy)) continue; if(ss[tempx][tempy]>ss[x][y]) ans=max(ans,dfs(tempx,tempy)); } dp[x][y]=ss[x][y]+ans; return dp[x][y]; } int main() { while(scanf("%d%d",&n,&k)!=EOF&&(n!=-1&&k!=-1)) { memset(dp,0,sizeof dp); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&ss[i][j]); printf("%d\n",dfs(0,0)); } return 0; }