1. 程式人生 > >HDU 1078 FatMouse and Cheese(記憶化搜索DP)

HDU 1078 FatMouse and Cheese(記憶化搜索DP)

題目 pan span pro 記憶 nbsp pac spa print

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1078

題目大意:一個n*n的圖,每個點都有奶酪,老鼠從(0,0)開始走,每次最多只能走k步就要停下來,停下的這個位置的奶酪數只能比上一個停留的位置大,並獲取其奶酪,每次只能水平或垂直走,問最多能得到的奶酪。

解題思路:記憶化搜索,這方面還是寫的太少,還要看別人才會,這個就當個例子參考吧。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
5 const int N=1e2+5; 6 int a[N][N],dp[N][N]; 7 int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 8 int n,k; 9 10 int dfs(int x,int y){ 11 int res=0; 12 if(dp[x][y]) return dp[x][y]; 13 for(int i=0;i<4;i++){ 14 for(int j=1;j<=k;j++){ 15 int xx=x+d[i][0]*j; 16 int
yy=y+d[i][1]*j; 17 if(xx<1||xx>n||yy<1||yy>n) 18 continue; 19 if(a[xx][yy]>a[x][y]) 20 res=max(res,dfs(xx,yy)); 21 } 22 } 23 dp[x][y]=res+a[x][y]; 24 return dp[x][y]; 25 } 26 27 int main(){ 28 while
(~scanf("%d%d",&n,&k)){ 29 if(n==-1&&k==-1) 30 break; 31 memset(dp,0,sizeof(dp)); 32 for(int i=1;i<=n;i++){ 33 for(int j=1;j<=n;j++){ 34 scanf("%d",&a[i][j]); 35 } 36 } 37 printf("%d\n",dfs(1,1)); 38 } 39 return 0; 40 }

HDU 1078 FatMouse and Cheese(記憶化搜索DP)