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\n",dfs(0,0)); 35 36 } 37 return 0; 38 }