标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078
题意:给出n, k,然后给出n*n的地图,(下标0~n-1),有一只老鼠从(0,0)处出发,只能走直线,并且目标点的数值比当前点要大。每次最长可以走k步,问最长的一条链的数值和。
用一个二维数组dp(i,j)表示某一格出发的时候最长链的数值和,然后dfs。
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 const int maxn = 111; 23 const int dx[4] = {0, 0, 1, -1}; 24 const int dy[4] = {1, -1, 0, 0}; 25 int n, k; 26 int G[maxn][maxn]; 27 int dp[maxn][maxn]; 28 29 bool ok(int x, int y) { 30 return x >= 0 && y >= 0 && x < n && y < n; 31 } 32 33 int dfs(int x, int y) { 34 if(dp[x][y]) return dp[x][y]; 35 int cur = 0; 36 for(int i = 0; i < 4; i++) { 37 for(int j = 1; j <= k; j++) { 38 int xx = x + dx[i] * j; 39 int yy = y + dy[i] * j; 40 if(ok(xx, yy) && G[xx][yy] > G[x][y]) { 41 cur = max(cur, dfs(xx, yy)); 42 } 43 } 44 } 45 return dp[x][y] = cur + G[x][y]; 46 } 47 48 inline bool scan_d(int &num) { 49 char in;bool IsN=false; 50 in=getchar(); 51 if(in==EOF) return false; 52 while(in!=‘-‘&&(in<‘0‘||in>‘9‘)) in=getchar(); 53 if(in==‘-‘){ IsN=true;num=0;} 54 else num=in-‘0‘; 55 while(in=getchar(),in>=‘0‘&&in<=‘9‘){ 56 num*=10,num+=in-‘0‘; 57 } 58 if(IsN) num=-num; 59 return true; 60 } 61 62 int main() { 63 // freopen("in", "r", stdin); 64 while(~scanf("%d%d", &n, &k) && n + k != -2) { 65 memset(dp, 0, sizeof(dp)); 66 for(int i = 0; i < n; i++) { 67 for(int j = 0; j < n; j++) { 68 scan_d(G[i][j]); 69 } 70 } 71 printf("%d\n", dfs(0, 0)); 72 } 73 return 0; 74 }
[HDOJ1078]FatMouse and Cheese(记忆化搜索)
标签:
原文地址:http://www.cnblogs.com/vincentX/p/5462473.html