poj 1088スキー--DP or深搜?
4213 ワード
#include<stdio.h>
#include<string.h>
int map[110][110],step[110][110];
int r,c;
int dfs(int i,int j)
{
if(step[i][j]!=0)
return step[i][j];
int max=0,zmax;
if(j-1>0&&map[i][j-1]<map[i][j])
{
zmax=dfs(i,j-1);
if(zmax>max)
max=zmax;
}
if(j+1<=c&&map[i][j+1]<map[i][j])
{
zmax=dfs(i,j+1);
if(zmax>max)
max=zmax;
}
if(i-1>0&&map[i-1][j]<map[i][j])
{
zmax=dfs(i-1,j);
if(zmax>max)
max=zmax;
}
if(i+1<=r&&map[i+1][j]<map[i][j])
{
zmax=dfs(i+1,j);
if(zmax>max)
max=zmax;
}
step[i][j]=max+1;
return step[i][j];
}
int main()
{
int i,j;
scanf("%d%d",&r,&c);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
scanf("%d",&map[i][j]);
memset(step,0,sizeof(step));
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
step[i][j]=dfs(i,j);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
if(step[i][j]>step[1][1])
step[1][1]=step[i][j];
printf("%d
",step[1][1]);
return 0;
}
/*
: height , len ( ), dot line[20000] (x,y) h.
。 , 。
, , , , 。
, height , , 。
+1; , len , ;
*/
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct dot//
{
int x;
int y;
int h;
};
dot line[20000]; //
int height[120][120]; // input
int len[120][120]; //dp ,
int cmp( const void *a ,const void *b) //
{
if((*(dot *)a).h>(*(dot *)b).h)
return 1;
else return -1;
}
int main ()
{
int m,n;
cin>>m>>n;
int i,j;
int flag=-1;
int max=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
flag++;
scanf("%d",&height[i][j]);
line[flag].x=i;
line[flag].y=j;
line[flag].h=height[i][j];
}
} //
qsort(line,m*n,sizeof(line[0]),cmp); // h
for(i=0;i<m*n;i++)
{
if(height[line[i].x][line[i].y]<height[line[i].x][line[i].y+1]&&len[line[i].x][line[i].y]>=len[line[i].x][line[i].y+1])
{
len[line[i].x][line[i].y+1]=len[line[i].x][line[i].y]+1;
}
if(height[line[i].x][line[i].y]<height[line[i].x+1][line[i].y]&&len[line[i].x][line[i].y]>=len[line[i].x+1][line[i].y])
{
len[line[i].x+1][line[i].y]=len[line[i].x][line[i].y]+1;
}
if(height[line[i].x][line[i].y]<height[line[i].x][line[i].y-1]&&len[line[i].x][line[i].y]>=len[line[i].x][line[i].y-1])
{
len[line[i].x][line[i].y-1]=len[line[i].x][line[i].y]+1;
}
if (height[line[i].x][line[i].y]<height[line[i].x-1][line[i].y]&&len[line[i].x][line[i].y]>=len[line[i].x-1][line[i].y])
{
len[line[i].x-1][line[i].y]=len[line[i].x][line[i].y]+1;
}
} //
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(len[i][j]>max)
max=len[i][j];
}
} // len ,
cout<<max+1<<endl;// 0,
return 0;
}