滑雪
1.状态表示:
i.集合:dp[i][j]所有从(i,j)开始滑的路径
ii.属性:Max
2.状态计算:
按第一步从哪个方向滑把路径分为4类
本来是一个dfs的过程,遍历所有的位置,找到从当前位置往下走的最大路径,再取最大值,可是这样做会有很多重复的位置被重新计算过,因此可以利用空间换时间的思想,把遍历过的位置往下走的路径的最大值进行记录,这就是记忆化搜索
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=310;
int w[N][N];
int f[N][N];
int dx[4]={0,-1,0,1};
int dy[4]={1,0,-1,0};
int n,m;
int dp(int x,int y){
int &v=f[x][y];
if(v!=-1)return v;
//v最小值为1
v=1;
//枚举四个方向
for(int i=0;i<4;i++){
int a=x+dx[i],v=1;b=y+dy[i];
if(a>=1&&a<=n&&b>=1&&b<=m&&w[a][b]<w[x][y]){
v=max(dp(a,b)+1,v);
}
}
return v;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&w[i][j]);
}
}
memset(f,-1,sizeof f);
int res=-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
res=max(res,dp(i,j));
}
}
printf("%d",res);
return 0;
}