题意:输入n,k 表示方格的长宽为n,每次能够走的最大格子为k,然后输入n行n列个数,起点在(0,0),每次可以上下左右移动,每次移动的格子要比当前格子数目大,而且移动的单位不能超过k,求最后能够得到的最大值。
分析:从起点开始搜,搜索那些点可以走,然后找最大值(记忆化搜索)
#include <iostream> #include <queue> #include <cstdio> #include <cstring> #include <cstdlib> #include <stack> #include <algorithm> using namespace std; const int maxn = 105; int num[maxn][maxn]; int dp[maxn][maxn]; int n; int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}}; int DFS(int x, int y, int k) { if(dp[x][y]!=-1) return dp[x][y]; int Max = 0; for(int i=0; i<4; i++) { for(int kk=1; kk<=k; kk++) { int xx = x+dir[i][0]*kk; int yy = y+dir[i][1]*kk; if(xx<1||xx>n||yy<1||yy>n) continue; if(num[xx][yy]<=num[x][y]) continue; Max = max(Max, DFS(xx, yy, k)); } } dp[x][y] = Max+num[x][y]; return dp[x][y]; } int main() { int k; while(scanf("%d%d", &n, &k)) { if(n==-1&&k==-1) break; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%d", &num[i][j]); } } memset(dp, -1, sizeof(dp)); int ans = DFS(1,1,k); printf("%d ", ans); } return 0; }