#include<iostream> #include<climits> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int N=1e3; int f[N][N],g[N][N]; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; struct a{ int x,y; int sum; bool operator <(const a &c)const//结构体内置排序函数 { return sum<c.sum; } }; vector<a>b; int main() { int r,c; cin>>r>>c; for(int i=1;i<=r;i++) { for(int j=1;j<=c;j++) { cin>>g[i][j]; b.push_back(a{i,j,g[i][j]}); f[i][j]=1; } } int mx=1; sort(b.begin(),b.end());//手动模拟一下就知道,如果不排序的话,有些情况是考虑不到的,所以从小到大排序一遍 for(auto h:b) { int w=h.x,m=h.y; for(int k=0;k<4;k++) { int q=h.x+dx[k]; int p=h.y+dy[k]; if(q>0&&q<=r&&p>0&&p<=c) if(h.sum>g[q][p]) { f[w][m]=max(f[w][m],f[q][p]+1); mx=max(f[w][m],mx); // cout<<f[w][m]<<endl; } } } cout<<mx<<endl; return 0; }
这题可以用dp来解决,也可以用记忆化搜索。
#include<iostream> using namespace std; const int N=1e3; int a[N][N],f[N][N]; int x[]={1,-1,0,0}; int y[]={0,0,1,-1}; int n,m; int dfs(int i,int j) { if(f[i][j])return f[i][j];//初始时f[i][j]都为0,如果不为0,那一定是搜索过了,直接返回即可 f[i][j]=1; for(int k=0;k<4;k++) { int ii=x[k]+i,jj=y[k]+j; if(a[ii][jj]<a[i][j]&&ii>0&&ii<=n&&jj>0&&jj<=m) { dfs(ii,jj); f[i][j]=max(f[i][j],f[ii][jj]+1); } } return f[i][j]; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; } } int ans=1; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { ans=max(ans,dfs(i,j)); } } cout<<ans<<endl; return 0; }