您的位置:首页 > 其它

poj 1088 滑雪 (状态压缩DP)

2014-01-20 22:21 302 查看
题目链接:
poj 1088

题目大意: 给出NxM的矩阵,每个点的值都不同

若某点四个方向中某个方向的值比它小则可以移动,求能够走的最长步数

解题思路: 经典的状态压缩Dp,Dp[ x ][ y ]记录从(x , y)点出发能走的最长步数

Dp[ x ][ y ]=Max(Dp[ x ][ y ],DFS(xx , yy) + 1)

若某个点之前已经走过,则不用再走,直接返回之前所能走到的最大值

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 120
#define Max(a,b) ((a>b)?a:b)
int Map[MAX][MAX],Dp[MAX][MAX];
int n,m,Fx[4][2]={{1,0},{-1,0},{0,-1},{0,1}};

int DFS(int x,int y)
{
int i,xx,yy;
if(Dp[x][y]!=0)   //已经搜索过的直接返回
return Dp[x][y];
for(i=0;i<4;i++)
{
xx=Fx[i][0]+x;
yy=Fx[i][1]+y;
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&Map[x][y]>Map[xx][yy]) //可以往下搜索
Dp[x][y]=Max(Dp[x][y],DFS(xx,yy)+1);
}
return Dp[x][y];  //x,y为起点的最优解
}

int main()
{
int i,j,M;
while(scanf("%d%d",&n,&m)!=EOF)
{
M=0;
memset(Dp,0,sizeof(Dp));
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
scanf("%d",&Map[i][j]);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
Dp[i][j]=DFS(i,j);    //枚举起点
M=Max(Dp[i][j],M);
}
}
printf("%d\n",M+1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: