题目大意:
找出最长的严格递减序列。
思路:
DAG中不固定起点的最长路径,进行记忆化搜索。
代码:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
char s[100];
int grid[105][105];
int dp[105][105];
int r,c;
//int dir[4];
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int d(int m,int n) {
int &ans = dp[m][n];
//bool flag =false;
if(ans) return ans;
bool flag = false;
for(int i = 0; i < 4; i++) {
int x = m + dir[i][0];
int y = n + dir[i][1];
if(x >= 0 && y >= 0 && x < r && y < c && grid[x][y] < grid[m][n]) {
ans = max(ans,d(x,y) + 1);
flag = true;
}
}
if(!flag) return 1;
return ans;
}
int main() {
int n;
scanf("%d",&n);
while(n--) {
scanf("%s",s);
scanf("%d %d",&r,&c);
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
scanf("%d",&grid[i][j]);
}
}
memset(dp,0,sizeof(dp));
int _max = 0;
for(int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
_max = max(_max,d(i,j));
printf("%s: %d\n",s,_max);
}
return 0;
}