POJ 1088 (DP)
来源:互联网 发布:九洲盛世网络竞技 编辑:程序博客网 时间:2024/04/29 16:46
感觉没啥技巧,中文题开始都看错了,以为 25-1的距离就是25,现在感觉很不在状态啊, 加油,调整状态。
首先,这题拿到了就感觉得先把结点按照高度(升序)来进行排序,然后在从低高度向高高度前进,这题另外需要注意的就是集中存储结构相互结合,别人怎么做的我不知道,我自己的必须得找出 x,y处高度在前面排序中的rank。
来看代码吧。
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define N 10010using namespace std;typedef struct{int x,y,h;}Node;Node a[N];int di[4][2] = {1,0,-1,0,0,1,0,-1};bool cmp(Node a,Node b){ return a.h<b.h;}int n,m;int dp[N];int map[101][101];//存储原图int rank[101][101];//原图中x,y的rankint main(){ cin >> n >> m;//行和列 int p = 0; for(int i=1; i<=n; ++i) for(int e=1; e<=m; ++e) { cin >> a[++p].h; map[i][e] = a[p].h; a[p].x = i; a[p].y = e; } sort(a+1, a+n*m+1, cmp); for(int i=1; i<=n*m; ++i) dp[i] = 1; for(int i=1; i<=n*m; ++i) { rank[a[i].x][a[i].y] = i; } for(int i=1; i<=n*m; ++i)//主要DP的位置,就是按照其高度进行遍历 { int kk,ff; for(int e=0; e<4; ++e) { kk = a[i].x + di[e][0]; ff = a[i].y + di[e][1]; if(0<kk&&kk<=n&&ff>0&&ff<=m&&map[kk][ff] < a[i].h&&dp[i] < dp[rank[kk][ff]]+1) dp[i] = dp[rank[kk][ff]] + 1; } } int ma = 0; for(int i=1; i<=n*m; ++i) if(ma < dp[i]) ma = dp[i]; cout << ma <<endl; return 0;}
- poj 1088 滑雪(DP)
- POJ 1088 滑雪 DP
- POJ 1088 (DP)
- poj 1088 滑雪 (DP)
- poj 1088 滑雪 DP
- POJ 1088 DFS+DP
- poj 1088 DP
- POJ 1088 DP
- POJ 1088 滑雪 DP
- POJ 1088-滑雪(dp)
- POJ 1088(dp)
- poj 1088 滑雪DP
- POJ 1088 滑雪 DP
- POJ-----1088---滑雪DP
- 【DP】POJ 1088 滑雪
- poj 1088 滑雪【DP备忘录】
- POJ 1088 DP+深搜 滑雪
- poj 1088 基础的DP
- 文件任务Gruntjs入门 (2)
- 每天一个linux命令(58):telnet命令
- 第七章:函数
- CentOS6.3+PHP-5.4.9+mysql-5.5.28+Nginx-1.3.8
- Python模块之---urllib,urllib2,httplib
- POJ 1088 (DP)
- 当你老了
- Eclipse Android使用技巧
- gedit增加对指定文件格式(如qml)的识别和启用合适的语法高亮
- ICMP控制报文协议
- 06.[推荐]善用FSO减少数据库负担
- ArrayAccess(数组式访问)接口,你有一个对象,但是你希望能将其看作一个数组
- POJ1083解题报告
- 【问题】在MyEclipse创建Filter