http://acm.pku.edu.cn/JudgeOnline/problem?id=1088
使用动态规划
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
#define MAX 101
int AA[MAX][MAX];
int BB[MAX][MAX];
int R,C;
int max,maxr,maxc;
int pp[4][2] = {
1,0,0,1,-1,0,0,-1
};
int foo(int row,int col){
if(row < 0 || row >= R || col < 0 || col >= C)
return 0;
if(BB[row][col] != -1)
return BB[row][col];
vector<int> vi;
for(int i = 3 ; i >= 0 ; --i){
int rr = row + pp[i][0];
int cc = col + pp[i][1];
if(!(rr < 0 || rr >= R || cc < 0 || cc >= C)){
if(AA[rr][cc] < AA[row][col])
//vi.push_back(AA[rr][cc]);
vi.push_back(foo(rr,cc));
}
}
if(!vi.empty())
return BB[row][col] = 1 + *max_element(vi.begin(),vi.end());
else
return BB[row][col] = 1 ;
}
int main(){
cin >> R >> C;
// cout << R << C << endl;
memset(BB,-1,sizeof(BB));
getchar();
for(int i = 0; i < R; ++i){
for(int j = 0; j < C ; ++j) {
scanf("%d",&AA[i][j]) ;
}
getchar();
}
for(int i = 0; i < R; ++i){
for(int j = 0; j < C ; ++j) {
foo(i,j);
}
}
int result = -1;
for(int i = 0; i < R; ++i){
for(int j = 0; j < C ; ++j) {
if(BB[i][j] > result)
result = BB[i][j];
}
}
cout << result << endl;
}