题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078
题目大意:一个胖老鼠要在一个n*n大小的棋盘里吃奶酪,这个老鼠每一步最多能走k单位远,而且每走一步,必须走到比当前点奶酪数多的点那去。告诉你这个棋盘里每个点上的奶酪个数,求这个老鼠最多能吃多少奶酪。
思路:类似于棋盘DP的记忆化DFS,直接搜加记忆答案就可以了。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #define MAXN 120 using namespace std; int map[MAXN][MAXN]; int f[MAXN][MAXN]; int xx[]={1,-1,0,0},yy[]={0,0,1,-1}; int n,k; int max(int a,int b) { if(a>b) return a; return b; } bool inMap(int x,int y) { if(x<1||x>n||y<1||y>n) return false; return true; } int dfs(int x,int y) { if(f[x][y]) return f[x][y]; int ans=0; for(int dist=1;dist<=k;dist++) for(int dir=0;dir<4;dir++) { int newx=x+xx[dir]*dist,newy=y+yy[dir]*dist; if(inMap(newx,newy)) if(map[newx][newy]>map[x][y]) ans=max(ans,dfs(newx,newy)); } ans+=map[x][y]; return f[x][y]=ans; } int main() { while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1) { memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); printf("%d\n",dfs(1,1)); } return 0; }
时间: 2024-11-09 06:46:18