//最长单调递减序列变形
#include <iostream>
#include <cstring>
using namespace std;
int dp(int , int );
int a[110][110];
int d[110][110];
int r;
int c;
int main()
{
int T;
cin >> T;
while(T--)
{
cin >> r >> c;
for(int i = 0; i <= r+1; i++)
a[i][0] = a[i][r+1] = 11111;
for(int j = 0; j <= c+1; j++)
a[0][j] = a[c+1][j] = 11111;
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
cin >> a[i][j];
int max_len = 0;
memset(d, 0, sizeof(d));
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
max_len = max_len > dp(i, j) ? max_len : dp(i, j);
cout << max_len << endl;
}
}
int dp(int i, int j)
{
if(d[i][j] > 0)
return d[i][j];
d[i][j] = 1;
if(i >= 1 && i <= r && j >= 1 && j <= c)
{
if(a[i][j] > a[i-1][j])
d[i][j] = d[i][j] > (dp(i-1, j) + 1) ? d[i][j] : (dp(i-1, j) + 1);
if(a[i][j] > a[i+1][j])
d[i][j] = d[i][j] > (dp(i+1, j) + 1) ? d[i][j] : (dp(i+1, j) + 1);
if(a[i][j] > a[i][j-1])
d[i][j] = d[i][j] > (dp(i, j-1) + 1) ? d[i][j] : (dp(i, j-1) + 1);
if(a[i][j] > a[i][j+1])
d[i][j] = d[i][j] > (dp(i, j+1) + 1) ? d[i][j] : (dp(i, j+1) + 1);
return d[i][j];
}
else
return 0;
}
南阳理工OJ_题目10 skiing
最新推荐文章于 2021-12-27 20:06:21 发布