题意: 求最长的一条连续递减的序列的长度。
思路: 本题范围太大,直接搜索会超时,所以要用记忆化搜索。
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#define INF 0x3f3f3f
#define ll long long
using namespace std;
int Map[1001][1001];
int dp[1001][1001];
int R,C;
int step;
int next[4][2]={0,1,1,0,0,-1,-1,0};
int dfs(int x,int y){
if(dp[x][y]) return dp[x][y];
int tx,ty;
int num=0;
for(int i=0; i<4; i++){
tx=x+next[i][0];
ty=y+next[i][1];
if(tx>=0 && tx<R && ty>=0 && ty< C){
if(Map[tx][ty]<Map[x][y]){
num=max(dfs(tx,ty)+1,num);
}
}
}
dp[x][y]=num;
return num;
}
int main(){
int T;
int a,b;
scanf("%d",&T);
while(T--){
step=0;
memset(dp,0,sizeof(dp));
memset(Map,0,sizeof(Map));
scanf("%d%d",&R,&C);
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
scanf("%d",&Map[i][j]);
}
}
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
step=max(step,dfs(i,j));
}
}
printf("%d\n",step+1);
}
return 0;
}