滑雪——记忆化搜索dp

P1434 [SHOI2002]滑雪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

记忆化搜索的入门第一题。

 

在递归中首先判断是否已经知道该点的数据,知道的话就返回,避免重复计算。——记忆化搜索的优点(目前认为)

状态表示:到坐标(i,j)的最大长度。

状态计算:f [ i , j ] =  m a x (f [ i - 1 , j ], f [ i , j - 1 ] , f [ i + 1 , j ]  ,f [ i , j + 1 ] ) + 1

dp思想用dfs表示出来

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=150;
 4 int r,c;
 5 int f[N][N],a[N][N];
 6 int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
 7 
 8 int dfs(int x,int y)
 9 {
10     if(f[x][y])return f[x][y];    //记忆化核心 
11     f[x][y]=1;
12     for(int i=0;i<4;i++)
13     {
14         int xx=dx[i]+x,yy=dy[i]+y;
15         if(xx>=1&&xx<=r&&yy>=1&&yy<=c&&a[xx][yy]<a[x][y])
16         {
17             f[x][y]=max(f[x][y],dfs(xx,yy)+1);
18         }
19     }
20     return f[x][y];    //记忆化核心 
21     
22 }
23 int main()
24 {
25     scanf("%d%d",&r,&c);
26     for(int i=1;i<=r;i++)
27         for(int j=1;j<=c;j++)
28             scanf("%d",&a[i][j]);
29     
30     int maxx=0;
31     for(int i=1;i<=r;i++)
32     {
33         for(int j=1;j<=c;j++)
34         {
35             int len=dfs(i,j);
36             maxx=max(len,maxx);
37         }
38     }
39     
40     printf("%d\n",maxx);
41     
42     return 0;
43 }
View Code

 

posted @ 2022-03-30 16:26  wellerency  阅读(58)  评论(0编辑  收藏  举报