找出最长的严格递减序列。
记忆化搜索
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char s[100];
int g[105][105];
int dp[105][105];
int r,c;
int vis[105][105];
int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};
int d(int x, int y) {
vis[x][y] = 1;
if(dp[x][y]) return dp[x][y];
int flag = 0;
for(int i=0; i<4; i++) {
int newx = x+dir[i][0];
int newy = y+dir[i][1];
if(newx>=0 && newx<r && newy>=0 && newy<c && g[newx][newy]<g[x][y]) {
int ans=d(newx, newy)+1;
if(ans > dp[x][y]) {
dp[x][y] = ans;
flag = 1;
}
}
}
if(!flag) return 1;
return dp[x][y];
}
int main() {
int kase, i, j;
scanf("%d", &kase);
while(kase--) {
scanf("%s%d%d",s, &r, &c);
for(i=0; i<r; i++) {
for(j=0; j<c; j++) {
scanf("%d", &g[i][j]);
}
}
int temp;
memset(dp, 0, sizeof(dp));
memset(vis, 0, sizeof(vis));
int ans=0;
for(i=0; i<r; i++)
for(j=0; j<c; j++) {
if(!vis[i][j])
temp = d(i,j);
if(temp > ans) {
ans = temp;
}
}
printf("%s: %d\n", s,ans);
}
return 0;
}