hdu 1078 FatMouse and Cheese(记忆化搜索)

题意:一个n*n的矩阵,每个点有若干块点心,小老鼠开始在左上角,每次最多往前走k步,且停留的点的点心数比上一次停留的点大,输出最大的i点心数

分析:停留的点数目必须比上次大,形成一个序,必定是一个DAG,那么dp[ix][y]表示从x,y出发得到的最大数量,如果已经搜索过x,y,直接返回dp[x][y]

裸的记忆话搜索

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=105;
 4 const int dx[]={0,0,1,-1};
 5 const int dy[]={1,-1,0,0};
 6 int a[maxn][maxn],dp[maxn][maxn];
 7 int n,k;
 8 
 9 inline bool judge(int x,int y){
10     return x>=0&&x<n&&y>=0&&y<n;
11 }
12 
13 int dfs(int x,int y){
14     if(dp[x][y])return dp[x][y];
15     int t=0;
16     for(int j=1;j<=k;j++)
17     for(int i=0;i<4;i++){
18         int nx=x+dx[i]*j;
19         int ny=y+dy[i]*j;
20         if(!judge(nx,ny))continue;
21         if(a[nx][ny]>a[x][y])t=max(t,dfs(nx,ny));
22     }
23     return dp[x][y]=a[x][y]+t;
24 }
25 
26 int main(){
27     
28     while(~scanf("%d%d",&n,&k)&&n>0&&k>0){
29         for(int i=0;i<n;i++)
30             for(int j=0;j<n;j++)
31                 scanf("%d",&a[i][j]);
32             
33         memset(dp,0,sizeof(dp));
34         printf("%d
",dfs(0,0));
35         
36     }
37     return 0;
38 }
View Code
原文地址:https://www.cnblogs.com/jihe/p/6566919.html