比较简单的DP,用记忆化搜索比较简单,递推。。。应该不好写吧 。
很容易发现,对于同一个位置,它的最长路是一定的, 不会变的,因为路是递减的,所以该题很适合用记忆化搜索 。 由此我们也可以发现DP和搜索的联系 。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int T,r,c,a[105][105],d[105][105];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
char name[1000];
int dp(int i,int j) {
int& ans = d[i][j];
if(ans >= 0) return ans;
ans = 1;
for(int k=0;k<4;k++) {
int u = i+dx[k];
int v = j+dy[k];
if(u<1||u>r||v<1||v>c) continue;
if(a[u][v]<a[i][j]) ans = max(ans,dp(u,v)+1);
}
return ans;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%s%d%d",name,&r,&c);
memset(d,-1,sizeof(d));
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
scanf("%d",&a[i][j]);
int ans = 0;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
ans = max(ans,dp(i,j));
printf("%s: %d\n",name,ans);
}
return 0;
}