InputThere are several test cases. Each test case consists of
a line containing two integers between 1 and 100: n and k
n lines, each with n numbers: the first line contains the number of blocks of cheese at locations (0,0) (0,1) ... (0,n-1); the next line contains the number of blocks of cheese at locations (1,0), (1,1), ... (1,n-1), and so on.
The input ends with a pair of -1‘s.
OutputFor each test case output in a line the single integer giving the number of blocks of cheese collected.
Sample Input
3 1 1 2 5 10 11 6 12 12 7 -1 -1
Sample Output
37
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define MAXN 101 /* 可以向一个方向最多移动k步 因为从一个位置进入所获得的收益是固定的和前面的状态没有关系,所以可以把这个结果记录下来节省时间 记忆化搜索 递归 在上下左右四个方向找 受益最大的格子同时记录 */ int n,k,g[MAXN][MAXN],dp[MAXN][MAXN]; int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; int Mdfs(int x,int y) { if(dp[x][y]) return dp[x][y]; int Max = 0; for(int i=0;i<4;i++) { for(int d=1;d<=k;d++) { int nx = x + dir[i][0]*d; int ny = y + dir[i][1]*d; if(nx<n&&nx>=0&&ny>=0&&ny<n&&g[nx][ny]>g[x][y]) Max = max(Max,Mdfs(nx,ny)); } } dp[x][y] = Max + g[x][y]; return dp[x][y]; } int main() { while(scanf("%d%d",&n,&k)) { if(n==-1&&k==-1) break; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) scanf("%d",&g[i][j]); } printf("%d\n",Mdfs(0,0)); } return 0; }
原文:http://www.cnblogs.com/joeylee97/p/6652793.html