题目链接
:http://acm.hdu.edu.cn/showproblem.php?pid=1078
题意:
老鼠每次最多只能走k步,停下的这个位置的数字比上一个停留的位置大,并获取其价值,每次只能水平或垂直走,问最大能得到的价值 简单DFS + 记忆化搜索#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<map> #define maxn 105 using namespace std; int n, k; int ans; int Map[maxn][maxn]; int dp[maxn][maxn]; int x[4] = {1, 0, -1, 0}; int y[4] = {0, 1, 0, -1}; int DFS(int r, int c) { int Max = 0; //cout << dp[r][c] << endl; if(dp[r][c]) return dp[r][c]; for(int i = 1; i <= k; i++) { for(int j = 0; j < 4; j++) { int rr = r + i * x[j]; int cc = c + i * y[j]; if(rr >= n || rr < 0 || cc >= n || cc < 0) continue; if(Map[rr][cc] > Map[r][c]) { Max = max(Max, DFS(rr, cc)); } } } return dp[r][c] = Max + Map[r][c]; } int main() { while(~scanf("%d %d", &n, &k)) { if(n == -1 && k == -1) break; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { scanf("%d", &Map[i][j]); } } memset(dp, 0, sizeof(dp)); ans = DFS(0, 0); cout << ans << endl; } return 0; }