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;
}