poj 1088 滑雪
来源:互联网 发布:淘宝法国灰太太正品吗 编辑:程序博客网 时间:2024/05/01 12:25
题目链接:http://poj.org/problem?id=1088
题目描述:给一个二维数组,从任意点开始,求其中最长的递减的序列的长度(四个方向)。。(不知道没写的人能不能看懂)
解题思路:做之前已经明确是DP的题目了。。然后就想到某点的最大值应该等于它附近点中最大的值加一,然后对地图中的点进行遍历,记忆化搜索,把值存到一个数组里,最后从数组中找到最大值就可以了。
AC代码:
#include<stdio.h>
#include<string.h>
int mm[105][105],r,c;
int len[105][105],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},vis[105][105];
int dp(int i,int j)
{
int max=0,n,m,l;
if(vis[i][j])return len[i][j];
else {
for(n=0;n<4;n++){
m=mm[i][j]-mm[i+dx[n]][j+dy[n]];//printf("%d",n);
if(m<=0||i+dx[n]<0||i+dx[n]>=r||j+dy[n]<0||j+dy[n]>=c)continue;
l=dp(i+dx[n],j+dy[n]);
if(1+l>max)max=1+l;
}
len[i][j]=max;
vis[i][j]=1;
return max;
}
}
int main()
{
memset(vis,0,sizeof(vis));
memset(len,0,sizeof(len));
scanf("%d%d",&r,&c);
int i,j,max=0;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
scanf("%d",&mm[i][j]);
for(i=0;i<r;i++)
for(j=0;j<c;j++)
{
len[i][j]=dp(i,j);
//printf("%d %d %d\n",i,j,len[i][j]+1);
if(len[i][j]>max)max=len[i][j];
}
printf("%d",max+1);
return 0;
}
其实vis数组在改改之后就可以不用了。。
然后题意理解错了,导致WA了两发。。幸好不是一个人在战斗。。以后得注意。。
AC截图:
我记得我们同学给我提交的时候是0ms来着。。。人品问题还是啥。。
- POJ 1088 滑雪
- POJ 1088 滑雪
- POJ 1088 滑雪
- Poj 1088 滑雪
- poj 1088 滑雪
- 滑雪--POJ--1088
- poj 1088 滑雪(DP)
- POJ 1088 滑雪
- POJ 1088 滑雪
- poj 1088 滑雪
- POJ 1088 滑雪
- poj 1088 滑雪
- POJ 1088 滑雪
- poj 1088 滑雪
- poj 1088 滑雪
- POJ 1088 滑雪 DP
- POJ 1088 滑雪
- Poj 1088 滑雪
- CSS3实践之路(三):CSS3的转换效果(transition)与动画(animation)
- 《苏菲的世界》~哲学是什么?
- 2014读书计划
- 查看 linux flash 分区大小,mtd,nor,nand,partition
- MySQL存储引擎
- poj 1088 滑雪
- Shark本地安装及可能出现的问题
- mysql是区分表名的大小写
- Genesis-3D学习手册——19.地形指南
- 开发板如何开启telnet服务
- Uva103 Stacking Boxes 贪心 深搜 +DP思想
- SQL删除部分字段重复
- Thrift交流(二)thrift服务端和客户端实现 Nifty
- Genesis-3D学习手册——20.地形高度