递归动态规划
#include <stdio.h>
#include <set>
using namespace std;
char name[100];
int arr[105][105];
int dp[105][105];
set<int> visited;
int m, n;
int get_dp(int i, int j){
int hash_v, pre_len;
hash_v = i*105+j;
if(visited.find(hash_v) != visited.end()){
return dp[i][j];
}
dp[i][j] = 1;
//up
if(i-1>=1 && arr[i-1][j]>arr[i][j]){
pre_len = get_dp(i-1, j);
if(pre_len+1 > dp[i][j])
dp[i][j] = pre_len+1;
}
//down
if(i+1 <= m && arr[i+1][j] > arr[i][j]){
pre_len = get_dp(i+1, j);
if(pre_len+1 > dp[i][j])
dp[i][j] = pre_len+1;
}
//left
if(j-1>=1 && arr[i][j-1]>arr[i][j]){
pre_len = get_dp(i, j-1);
if(pre_len+1 > dp[i][j])
dp[i][j] = pre_len+1;
}
//right
if(j+1<=n && arr[i][j+1]>arr[i][j]){
pre_len = get_dp(i, j+1);
if(pre_len+1 > dp[i][j])
dp[i][j] = pre_len+1;
}
visited.insert(hash_v);
return dp[i][j];
}
void func(int m, int n){
int i, j, len;
int max;
max = -1;
visited.clear();
for(i=1; i<=m; i++){
for(j=1; j<=n; j++){
len = get_dp(i, j);
if(max < len)
max = len;
}
}
printf("%s: %d\n", name, max);
}
int main(void){
int i, j, case_count;
//freopen("input.dat", "r", stdin);
scanf("%d", &case_count);
while(case_count--){
scanf("%s %d %d", name, &m, &n);
for(i=1; i<=m; i++){
for(j=1; j<=n; j++){
scanf("%d", arr[i]+j);
}
}
func(m, n);
}
return 0;
}