题目连接:点击打开链接
解题: 刚看这道题时一头雾水,想排序之后又不知道该怎么做,只好搜结题报告。这才发现是动态规划问题,茅塞顿开。
重点:DP方程:len[ i ][ j ] = max{ len[ i-1][ j ], len[ i ][ j-1], len[ i+1][ j ], len[ i ][ j+1] }; 保证:在图内。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int height[110][110];
int len[110][110]; //记录
int r, c;
int dp(int i, int j){ //为len赋值
if(len[i][j]!=0){
return len[i][j];
}
int max = -1;
if(i>0&&height[i-1][j]<height[i][j]){
if(dp(i-1,j)>max){
max = dp(i-1,j);
}
}
if(i+1<r&&height[i+1][j]<height[i][j]){
if(dp(i+1, j)>max){
max = dp(i+1, j);
}
}
if(j>0&&height[i][j-1]<height[i][j]){
if(dp(i, j-1)>max){
max = dp(i,j-1);
}
}
if(j+1<c&&height[i][j+1]<height[i][j]){
if(dp(i, j+1)>max){
max = dp(i, j+1);
}
}
len[i][j]=max+1;
return len[i][j];
}
int main()
{
int i , j, max;
//freopen("a.txt", "r", stdin);
while(scanf("%d%d", &r, &c)!=EOF){
memset(len, 0, sizeof(len));
for(i=0; i<r; i++){
for(j=0; j<c; j++){
scanf("%d", &height[i][j]);
}
}
max = -1;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
if(max<dp(i, j)){
max = dp(i, j);
}
}
}
printf("%d\n", max+1);
}
return 0;
}