http://acm.nyist.net/JudgeOnline/problem.php?pid=10
当开始思路错了,wa了好多次
动态规划与搜索的结合,用二维数组保存当前搜到的点为递增序列最大值的最长递增序列的长度
#include<stdio.h>
#include<string.h>
int map[105][105];
int visit[105][105];//保存当前最长递增序列的长度
int f[4][2]={-1,0,0,1,1,0,0,-1};
int p,q,count,sum,n,m;
int dfs(int p,int q)
{
int i,k,s;
if(visit[p][q]>1)
{
return visit[p][q];
}
s=map[p][q];
for(i=0;i<4;i++)
{
if(p+f[i][0]<=n&&q+f[i][1]<=m&&p+f[i][0]>=1&&q+f[i][1]>=1)
{
k=map[p+f[i][0]][q+f[i][1]];
if(k<s)
{
count=dfs(p+f[i][0],q+f[i][1]);
if(visit[p][q]<count+1)
visit[p][q]=count+1;
}
}
}
return visit[p][q];
}
int main()
{
int t,i,j,max;
scanf("%d",&t);
while(t--)
{
max=-1;
memset(map,0,sizeof(map));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
visit[i][j]=1;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
dfs(i,j);
if(visit[i][j]>max)
max=visit[i][j];
}
printf("%d\n",max);
}
return 0;
}