nylgoj10
这个属于动态规划的问题,其实就是把以前所经历过的节点给保存起来,等到下次计算的时候不再进行分值的遍历了,而是直接的进行使用。
#include<stdio.h>
#include<string.h>
#define MAX 101
int height[MAX][MAX];
int tem[MAX][MAX];
int r,c;
int dir[4][2]={-1,0,1,0,0,1,0,-1};
int main()
{
int dfs(int x,int y);
int t;
int i,j,res;
scanf("%d",&t);
while(t--)
{
res=0;
scanf("%d%d",&r,&c);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
scanf("%d",&height[i][j]);
tem[i][j]=0;
}
for(i=1;i<=c;i++)
for(j=1;j<=c;j++)
{
tem[i][j]=dfs(i,j);
if(tem[i][j]>res)
res=tem[i][j];
}
printf("%d\n",res+1);
}
return 0;
}
bool isvalueable(int x,int y)
{
if(x>0&&x<=r && y>0 && y<=c)
return true;
return false;
}
int dfs(int x,int y)
{
if(tem[x][y]>0) return tem[x][y];
//核心代码
int max=0,i;//max定义的位置很重要
for(i=0;i<4;i++)
{
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(isvalueable(tx,ty))
{
if(height[x][y]>height[tx][ty])
{
int m=dfs(tx,ty)+1;//m
if(max<m) max=m;
}
}
}
return max;
}

浙公网安备 33010602011771号