题目大意:
就是现在有一个n*n的矩阵, 每个矩阵上对应一个数字代表进入该位置能得到的能量(奶酪), 现在老鼠从点(0, 0)除法要求每次只能水平或者竖直方向移动不超过k格, 并且每次移动到的新位置的能量之比原来的位置的能量值高,走过的位置不能再走,问最终能得到的能量的最大值
大致思路:
用dp[ i ][ j ] 表示到位置(i, j)的能量最大值,那么用dfs搜索接下能移动到的位置,对于已经走过的位置记忆话搜索即可
代码如下:
Result : Accepted Memory : 348 KB Time : 46 ms
/* * Author: Gatevin * Created Time: 2014/8/14 18:09:43 * File Name: haha.cpp */ #include<iostream> #include<sstream> #include<fstream> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<cctype> #include<cmath> #include<ctime> #include<iomanip> using namespace std; const double eps(1e-8); typedef long long lint; int n,k; bool vis[101][101]; int energy[101][101]; int dp[101][101]; int dfs(int x, int y) { bool flag = false;//标记递归到(x, y)之后是否能继续递归 if(dp[x][y]) return dp[x][y];//如果dp[x][y]已经访问过 for(int i = 1; i <= k; i++) { if(x + i < n && !vis[x + i][y] && energy[x + i][y] > energy[x][y]) { flag = true; vis[x + i][y] = 1; dp[x][y] = max(dp[x][y], dfs(x + i, y) + energy[x][y]); vis[x + i][y] = 0; } if(x - i >= 0 && !vis[x - i][y] && energy[x - i][y] > energy[x][y]) { flag = true; vis[x - i][y] = 1; dp[x][y] = max(dp[x][y], dfs(x - i, y) + energy[x][y]); vis[x - i][y] = 0; } if(y + i < n && !vis[x][y + i] && energy[x][y + i] > energy[x][y]) { flag = true; vis[x][y + i] = 1; dp[x][y] = max(dp[x][y], dfs(x, y + i) + energy[x][y]); vis[x][y + i] = 0; } if(y - i >= 0 && !vis[x][y - i] && energy[x][y - i] > energy[x][y]) { flag = true; vis[x][y - i] = 1; dp[x][y] = max(dp[x][y] , dfs(x, y - i) + energy[x][y]); vis[x][y - i] = 0; } } if(flag) { return dp[x][y]; } else { dp[x][y] = energy[x][y];//不能继续递归说明这是终点,修改dp[x][y]为访问过 return energy[x][y]; } } int main() { while(scanf("%d %d", &n, &k) == 2) { if(n == -1 && k == -1) break; memset(vis, 0, sizeof(vis)); memset(dp, 0, sizeof(dp)); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { scanf("%d", &energy[i][j]); } } vis[0][0] = 1; dfs(0, 0); printf("%d\n", dp[0][0]); } return 0; }