hdu 1078
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1078
题意:老鼠偷吃,有n*n的方阵,每个格子里面放着一定数目的粮食,老鼠每次只能水平或竖直最多走k步,每次必须走食物比当前多的格子,问最多吃多少食物。
mark:记忆化搜索。
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int n,m,max1; int s[110][110],dp[110][110]; int tab[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; int max(int a, int b) {return a > b ? a : b;} int dfs(int x, int y) { int xx,yy; int max1 = 0, sum; if(!dp[x][y]) { for(int j = 1; j <= m; j++) { for(int i = 0; i < 4; i++) { xx = x+tab[i][0]*j; yy = y+tab[i][1]*j; if(xx >= 0 && xx < n && yy >= 0 && yy < n && s[xx][yy] > s[x][y]) { sum = dfs(xx, yy); max1 = max(max1, sum); } } } dp[x][y] = max1+s[x][y]; } return dp[x][y]; } int main() { int i,j; while(scanf("%d%d", &n, &m), n > 0) { for(i = 0; i < n; i++) for(j = 0; j < n; j++) scanf("%d", &s[i][j]); memset(dp, 0, sizeof(dp)); printf("%d\n", dfs(0, 0)); } return 0; }