题目大意:给出一个二维数组,找出一串最长的递减序列
解题思路:记忆化扫描
#include<cstdio>
#include<cstring>
#define maxn 105
int arr[maxn][maxn],R,C,dp[maxn][maxn],max;
char str[100];
int DP(int i , int j) {
if(dp[i][j])
return dp[i][j];
if(i >= 1 && i <= R && j >= 1 && j <= C) {
int k,l,m;
if(arr[i][j] > arr[i+1][j])
dp[i][j] = DP(i+1,j) + 1;
if(arr[i][j] > arr[i-1][j] && dp[i][j] < (k = DP(i-1,j) + 1))
dp[i][j] = k ;
if(arr[i][j] > arr[i][j+1] && dp[i][j] < (l = DP(i,j+1) + 1))
dp[i][j] = l ;
if(arr[i][j] > arr[i][j-1] && dp[i][j] < (m = DP(i,j-1) + 1))
dp[i][j] = m ;
if(dp[i][j] == 0)
dp[i][j] = 1;
}
return dp[i][j];
}
int main() {
int test;
scanf("%d", &test);
while(test--) {
scanf("%s",str);
scanf("%d%d",&R,&C);
memset(dp,0,sizeof(dp));
memset(arr,0,sizeof(arr));
for(int i = 1; i <= R; i++)
for(int j = 1; j <= C; j++)
scanf("%d", &arr[i][j]);
max = -1;
int z;
for(int i = 1; i <= R; i++)
for(int j = 1; j <= C; j++) {
z = DP(i,j);
if(z > max)
max = z;
}
printf("%s: %d\n",str,max);
}
return 0;
}