POJ 1088 滑雪(dp)
2014-05-07 07:20
316 查看
题目:
http://poj.org/problem?id=1088
题意:
寻找一个二维数组中最长递减序列的长度
题解:
动态规划,dp()函数求以[i,j]为起始的最优解,函数内调用自身判断4个方向里满足条件的局部最优解,可解。
代码:
http://poj.org/problem?id=1088
题意:
寻找一个二维数组中最长递减序列的长度
题解:
动态规划,dp()函数求以[i,j]为起始的最优解,函数内调用自身判断4个方向里满足条件的局部最优解,可解。
代码:
#include<stdio.h> #include<string> int ans[101][101];//存储当前位置能得到的最优解 int map[101][101];//存储当前位置的元素值 int dir[4][2]={1,0,0,1,-1,0,0,-1};//四个方向,右,上,左,下 int N,M; int max(int a,int b) { return a>b?a:b; } int dp(int i,int j)//得到[i,j]位置的最优解 { if(ans[i][j]>0) return ans[i][j]; //寻找四个方向的局部满足要求的最优解 int t,tempi,tempj; int maxn=0; for(t=0;t<4;t++) { tempi=i+dir[t][0]; tempj=j+dir[t][1]; if(tempi>0&&tempi<=N&&tempj>0&&tempj<=M) //不可越界 { if(map[tempi][tempj]<map[i][j])//低于[i,j] maxn=max(maxn,dp(tempi,tempj)); } } return ans[i][j]=maxn+1; } int main() { while(~scanf("%d%d",&N,&M)) { int answer=0; int i,j; for(i=1;i<=N;i++) { for(j=1;j<=M;j++) { scanf("%d",&map[i][j]); } } memset(ans,0,sizeof(ans)); for(i=1;i<=N;i++) { for(j=1;j<=M;j++) { ans[i][j]=dp(i,j);//得到[i,j]位置的最优解 answer=max(answer,ans[i][j]);//更新整体最优解 } } printf("%d\n",answer); } return 0; }
相关文章推荐
- 实用有效的店长站长推广操作解析
- YII中CListView列表形式的模板设置,包括pager和sorter的细节
- 树
- OSGI容器与插件
- CocoStudio开发之背景音乐播放两秒就没声音问题
- 【SSH2(实践篇)】--Struts2文件上传下载实例
- mysql应该监控的变量
- 字节数组转化为16进制字符串
- 5656777
- android custom_title
- kafka 源码 导入eclipse中
- matlab的一些命令
- hdu_4707
- hdu_4707
- 498989
- JAXB玩转命名空间
- .NET:不显示窗口的应用程序框架
- 哈佛大学:探索地外文明的先行者
- Numerical Analysis---Hermite Interpolation
- 条形码扫描枪数据读取的问题