UVa 10285 - Longest Run on a Snowboard
2015-07-14 19:50
267 查看
称号:给你一个二维矩阵,找到一个点。每一个可以移动到的位置相邻的上下,求最长单调路径。
分析:贪婪,dp。搜索。
这个问题是一个小样本,我们该怎么办。
这里使用贪心算法:
首先。将全部点依照权值排序(每一个点一定被值更大的点更新);
然后,按顺序更新排序后。每一个点更新周围的点;
最后,找到最大值输出就可以。
说明:╮(╯▽╰)╭居然拍了1000+,还以为这样的方法比較快呢(数据分布啊╮(╯▽╰)╭)。
分析:贪婪,dp。搜索。
这个问题是一个小样本,我们该怎么办。
这里使用贪心算法:
首先。将全部点依照权值排序(每一个点一定被值更大的点更新);
然后,按顺序更新排序后。每一个点更新周围的点;
最后,找到最大值输出就可以。
说明:╮(╯▽╰)╭居然拍了1000+,还以为这样的方法比較快呢(数据分布啊╮(╯▽╰)╭)。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; typedef struct nodep { int value,x,y; }point; point now,Node[10004]; char buf[256]; int maps[102][102]; int imap[102][102]; int dmap[102][102]; int cmp1( point a, point b ) { return a.value > b.value; } int cmp2( point a, point b ) { return a.value < b.value; } int main() { int T,R,C,dxy[4][2] = {1,0,0,1,-1,0,0,-1}; while ( ~scanf("%d",&T) ) while ( T -- ) { scanf("%s%d%d",buf,&R,&C); int count = 0; for ( int i = 1 ; i <= R ; ++ i ) for ( int j = 1 ; j <= C ; ++ j ) { scanf("%d",&maps[i][j]); imap[i][j] = dmap[i][j] = 1; Node[count].value = maps[i][j]; Node[count].x = i; Node[count].y = j; count ++; } sort( Node, Node+count, cmp1 ); for ( int i = 0 ; i < count ; ++ i ) { for ( int j = 0 ; j < 4 ; ++ j ) { now.x = Node[i].x+dxy[j][0]; now.y = Node[i].y+dxy[j][1]; if ( now.x >= 1 && now.x <= R && now.y >= 1 && now.y <= C ) { if ( maps[now.x][now.y] < maps[Node[i].x][Node[i].y] ) if ( dmap[now.x][now.y] < dmap[Node[i].x][Node[i].y]+1 ) dmap[now.x][now.y] = dmap[Node[i].x][Node[i].y]+1; } } } sort( Node, Node+count, cmp1 ); for ( int i = 0 ; i < count ; ++ i ) { for ( int j = 0 ; j < 4 ; ++ j ) { now.x = Node[i].x+dxy[j][0]; now.y = Node[i].y+dxy[j][1]; if ( now.x >= 1 && now.x <= R && now.y >= 1 && now.y <= C ) { if ( maps[now.x][now.y] > maps[Node[i].x][Node[i].y] ) if ( imap[now.x][now.y] < imap[Node[i].x][Node[i].y]+1 ) imap[now.x][now.y] = imap[Node[i].x][Node[i].y]+1; } } } int max = 0; for ( int i = 1 ; i <= R ; ++ i ) for ( int j = 1 ; j <= C ; ++ j ) { if ( max < imap[i][j] ) max = imap[i][j]; if ( max < dmap[i][j] ) max = dmap[i][j]; } printf("%s: %d\n",buf,max); } return 0; }
相关文章推荐
- 无限分类树操作
- espcms内容页相册调用代码
- c++对象模型-the semantics of constr ad97 uctors
- 【SeekBar】Android 自定义漂亮的SeekBar样式
- debian 8下修改默认编辑器
- C8_指针练习
- LeetCode题解——Generate Parentheses
- 大楼扔鸡蛋问题(动态规划)
- 【Spark】SparkContext源码解读
- 【Spark】Spark的Shuffle机制
- [转载] 最全最强解析:支付宝系统架构内部剖析(架构图)
- C8_指针
- Class文件结构
- VB编程概述
- 大数开根号(蓝桥杯-矩阵翻硬币)
- 架构师速成6.5-也谈设计模式
- iOS为什么Block的属性声明要用copy
- 【Spark】Spark容错机制
- 架构师速成6.5-也谈设计模式 分类: 架构师速成 2015-07-14 19:48 284人阅读 评论(0) 收藏
- 【leetcode】二叉树的LCA问题:Lowest Common Ancestor of a Binary Tree