#include#include #include using namespace std; const int N=110; int n,m; int g[N][N]; bool st[N][N]; int dx[]={1,-1,0,0}; int dy[]={0,0,-1,1}; int dfs(int x,int y) { int cnt=1; for(int i=0;i<4;i++) { int a=dx[i]+x; int b=dy[i]+y; if(a<1||a>n||b<1||b>m)continue; if(g[a][b]>=g[x][y])continue; st[a][b]=true; cnt++; cnt+=dfs(a,b); st[a][b]=false; cnt--; } return cnt; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&g[i][j]); } int res=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { memset(st,0,sizeof st); res=max(res,dfs(i,j)); cout< 原因,每次cnt 都被叠加;问题:每次搜索到最后返回的时候,cnt被累加;(没进行记忆化剪枝)
改进:
#include#include #include using namespace std; const int N=110; int n,m; int g[N][N]; int s[N][N]; bool st[N][N]; int dx[]={1,-1,0,0}; int dy[]={0,0,-1,1}; int dfs(int x,int y) { if(s[x][y])return s[x][y];//记忆化剪枝;如果被更新直接返回; s[x][y]=1; for(int i=0;i<4;i++) { int a=dx[i]+x; int b=dy[i]+y; if(a<1||a>n||b<1||b>m)continue; if(g[a][b]>=g[x][y])continue; dfs(a,b); s[x][y]=max(s[x][y],s[a][b]+1);//搜索中每个方向的点更新; } return s[x][y]; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&g[i][j]); } int res=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { memset(st,0,sizeof st); res=max(res,dfs(i,j)); } cout<


![【无标题】洛谷P1434 [SHOI2002]滑雪(记忆化搜索) 【无标题】洛谷P1434 [SHOI2002]滑雪(记忆化搜索)](http://www.mshxw.com/aiimages/31/862130.png)
