POJ1088(滑雪)
求滑行最长的长度,动态规划加记忆化
#include<stdio.h>
int m,n,MAX=0;
struct Node
{
int height;
int visit;
int len;
}node[105][105];
int max4(int a,int b,int c,int d)
{
if(a<b)a=b;
if(a<c)a=c;
if(a<d)a=d;
return a;
}
int dp(int x,int y)
{
int r,l,d,t,M;
if(node[x][y].visit)return node[x][y].len;
if(node[x][y].height<=node[x-1][y].height&&node[x][y].height<=node[x+1][y].height&&node[x][y].height<=node[x][y+1].height&&node[x][y].height<=node[x][y-1].height)
{
node[x][y].len=1;
node[x][y].visit=1;
return 1;
}
if(x+1<=m&&node[x][y].height>node[x+1][y].height)
{
d=1+dp(x+1,y);
}
else
d=1;
if(x-1>0&&node[x][y].height>node[x-1][y].height)
{
t=1+dp(x-1,y);
}
else
t=1;
if(y+1<=n&&node[x][y].height>node[x][y+1].height)
{
r=1+dp(x,y+1);
}
else
r=1;
if(y-1>0&&node[x][y].height>node[x][y-1].height)
{
l=1+dp(x,y-1);
}
else
l=1;
M=max4(r,l,d,t);
node[x][y].visit=1;
node[x][y].len=M;
return M;
}
int main()
{
int i,j,MAX;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&node[i][j].height);
node[i][j].len=0;
node[i][j].visit=0;
}
}
for(i=0;i<=m+1;i++)
{
node[i][0].height=10001;
node[i][n+1].height=10001;
}
for(i=0;i<=n+1;i++)
{
node[0][i].height=10001;
node[m+1][i].height=10001;
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
dp(i,j);
}
}
MAX=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(MAX<node[i][j].len)
MAX=node[i][j].len;
}
}
printf("%d\n",MAX);
return 0;
}

浙公网安备 33010602011771号