题意:
给一个R*C大小的int型矩阵,起点终点任意,每次只能朝一个方向(上下左右均可,不能斜着走)走一步,且只能从更大的数走向更小的数,求最长路径。
题解:
记忆化DP。DP[i][j]表示从(i,j)出发所能走的最长路径,则状态转移方程可描述如下:对于上下左右4个方向,如果走得通的话,则选择能走的最远的一个方向走。
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int a[100][100], DP[100][100], R, C; string name;
int dp(int i, int j)
{
if (DP[i][j]>0) return DP[i][j];
int llr = 1; //左右上下分别试探
if (i - 1 >= 0 && a[i][j] > a[i - 1][j])llr = max(llr, 1 + dp(i - 1, j));
if (i + 1 < R && a[i][j] > a[i + 1][j])llr = max(llr, 1 + dp(i + 1, j));
if (j - 1 >= 0 && a[i][j] > a[i][j - 1])llr = max(llr, 1 + dp(i, j - 1));
if (j + 1 < C && a[i][j] > a[i][j + 1])llr = max(llr, 1 + dp(i, j + 1));
return DP[i][j] = llr;
}
int main()
{
int N, lr; cin >> N;
while (N--)
{
cin >> name >> R >> C; memset(DP, 0, sizeof(DP)); lr = 0;
for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) cin >> a[i][j];
for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) lr = max(lr, dp(i, j));
cout << name << ": " << lr << endl;
}
return 0;
}