这题,简单的DP加上递归。
题目的意思,从任意一个起点出发,找一条最长的路径。
下面的是AC的代码:
#include <iostream>
#include <cstring>
using namespace std;
int num[102][102];
int dp[102][102];
int r, c;
int xy[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
int ans;
int solve(int i, int j)
{
int max = -1;
if(dp[i][j] != 0)
return dp[i][j];
for(int k = 0; k < 4; k++)
{
int temp_i = i + xy[k][0];
int temp_j = j + xy[k][1];
if(temp_i >= 0 && temp_i < r && temp_j >= 0 && temp_j < c && num[temp_i][temp_j] < num[i][j])
{
int res = solve(temp_i, temp_j); //递归,求解最长的
if(res > max)
max = res;
}
}
dp[i][j] = max + 1;
return dp[i][j];
}
int main()
{
int i, j;
while(scanf("%d%d", &r, &c) != EOF)
{
memset(dp, 0, sizeof(dp));
ans = 0;
for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
scanf("%d", &num[i][j]);
for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
{
int res = solve(i, j);
ans = res > ans ? res : ans;
}
printf("%d\n", ans + 1);
}
return 0;
}