#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int M = 110;
int a[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int dp[M][M]; //dp[i][j]表示以(i,j)为起点的最长的长度
int map[M][M];
int ans,tmp;
int R,C;
int DP(int i,int j) //比较(i,j)周围的四个位置 。。。相当于所说的状态转移方程
{
if(dp[i][j] > 0)
return dp[i][j];
for(int k = 0; k < 4; k++)
{
if( (i+a[k][0] >= 1) && (i+a[k][0] <= R) && (j+a[k][1] <= C) &&(j+a[k][1] >= 1) && map[ i+a[k][0] ][j+a[k][1] ] < map[i][j] )
{
if(dp[i][j] < DP(i+a[k][0],j+a[k][1]) + 1)
dp[i][j] = DP(i+a[k][0],j+a[k][1]) + 1;
}
}
return dp[i][j];
}
int main()
{
memset(dp,0,sizeof(dp));
cin >> R >>C;
for(int i = 1; i <= R; i++)
for(int j = 1; j <= C; j++)
scanf("%d",&map[i][j]);
for(int i = 1; i <= R; i++)
for(int j = 1; j <= C; j++)
{
int aa = DP(i,j);
if(ans < aa)
ans = aa;
// if(ans < DP(i,j)) 这样写的话,会进入DP(i,j)两次啊。。。
// ans = DP(i,j);
}
cout << ans + 1<<endl;
}
poj 1088滑雪
最新推荐文章于 2022-02-25 19:38:17 发布