25
这题是dp类的,dp不会就是搜索
暴力搜索:
#include <cstdio> #include <algorithm> #include <cstring> #include <iostream> using namespace std; const int SIZE=1e2+10; int map[SIZE][SIZE]; int n,m; int f[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; bool in(int x,int y) { return x>0&&x<=n&&y>0&&y<=m; } void dfs(int i,int j,int &ans,int cnt)///这里ans运用了引用,函数的参数有了返回值的作用,也可以定以为全局变量 { ans=max(ans,cnt); for(int k=0; k<4; k++) { int x=f[k][0]+i; int y=f[k][1]+j; if(in(x,y)&&map[i][j]>map[x][y]) dfs(x,y,ans,cnt+1); } } int main() {int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d",&map[i][j]); int ans=-1; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) dfs(i,j,ans,1); printf("%d\n",ans); } return 0; }记忆化搜索:
#include <cstdio> #include <algorithm> #include <cstring> #include <iostream> using namespace std; const int SIZE=1e2+10; int map[SIZE][SIZE]; int dp[SIZE][SIZE]; int n,m; int f[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; bool in(int x,int y) { return x>0&&x<=n&&y>0&&y<=m; } int dfs(int i,int j,int num)///记忆化搜索用dp[][]记录搜索过点的值,再搜索到该点就不需要再算了 { if(dp[i][j]!=-1)///判断是否搜过 return dp[i][j]; int ans=0; for(int k=0; k<4; k++) { int x=f[k][0]+i; int y=f[k][1]+j; if(in(x,y)&&map[i][j]>map[x][y]) { dp[x][y]=dfs(x,y,num+1); ans=max(dp[x][y],ans); } } dp[i][j]=ans+1;//初始条件 return dp[i][j]; } int main() {int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) scanf("%d",&map[i][j]); } memset(dp,-1,sizeof(dp)); int ans=-1; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { int cnt=dfs(i,j,1); ans=max(cnt,ans); } printf("%d\n",ans); } return 0; }