这道题 我没看出来 他只可以往下走,我看到的 8-connected ;所以今天写一下如果是 8-connected 怎么解;

其实说白了这个就是从上到下走一条线到达最后一行的距离最小; 从Map【a】【b】 到Map【a】【b+1】 的距离是Map【a】【b+1】 以此类推:建图即可;

然后在加一个点0,和n+m+1 点这样在建立一下从  0 点到第一行的边,和最后一行到(n+m+1) 的边 求一个从0 到(n+m+1) 的最短路径就好了,

怎么维护最右侧?:  Dijkstra  有 队列优化!多以我们可以再这个由下级队列里面 吧col 号也设置进去;这样就可以使答案的字典序最大,也就是最右侧:

代码.cpp

  

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <iostream>
  7. #include <set>
  8. #include <map>
  9. #include <vector>
  10. #include <queue>
  11. #include <string>
  12. using namespace std;
  13. int n,m;
  14. int mat[105][105];
  15. int dd[][2]={-1,1, -1,0, -1,-1, 0,1, 0,-1, 1,1, 1,0, 1,-1 };
  16. int ddd[][2]={1,-1,1,0,1,1};
  17. bool jude(int x,int y)
  18. {
  19. return x>=1&&x<=n&&y>=1&&y<=m;
  20. }
  21. int ID(int x,int y)
  22. {
  23. return (x-1)*m+y;
  24. }
  25. const int INF = 1000000000;
  26. const int maxn =10000+10;
  27. struct Edge {
  28. int from, to, dist,col;
  29. Edge(){}
  30. Edge(int from,int to,int dist,int col):from(from),to(to),dist(dist),col(col){}
  31. };
  32. struct HeapNode {
  33. int d, u , col;
  34. HeapNode(){}
  35. HeapNode(int d,int u,int col):d(d),u(u),col(col){}
  36. bool operator < (const HeapNode& rhs) const {
  37. if(d==rhs.d) return col<rhs.col;
  38. return d > rhs.d;
  39. }
  40. };
  41.  
  42. struct Dijkstra {
  43. int n, m;
  44. vector<Edge> edges;
  45. vector<int> G[maxn];
  46. bool done[maxn];
  47. int d[maxn];
  48. int p[maxn];
  49. void init(int n) {
  50. this->n = n;
  51. for(int i = 0; i < n; i++) G[i].clear();
  52. edges.clear();
  53. }
  54. void AddEdge(int from, int to, int dist,int col) {
  55. edges.push_back(Edge(from, to, dist,col));
  56. m = edges.size();
  57. G[from].push_back(m-1);
  58. }
  59. void dijkstra(int s) {
  60. priority_queue<HeapNode> Q;
  61. for(int i = 0; i < n; i++) d[i] = INF;
  62. d[s] = 0;
  63. memset(done, 0, sizeof(done));
  64. Q.push( HeapNode(0, s , 0)) ;
  65. while(!Q.empty()) {
  66. HeapNode x = Q.top(); Q.pop();
  67. int u = x.u;
  68. if(done[u]) continue;
  69. done[u] = true;
  70. for(int i = 0; i < G[u].size(); i++) {
  71. Edge& e = edges[G[u][i]];
  72. if(d[e.to] > d[u] + e.dist) {
  73. d[e.to] = d[u] + e.dist;
  74. p[e.to] = G[u][i];
  75. Q.push(HeapNode(d[e.to], e.to, e.col));
  76. }
  77. }
  78. }
  79. }
  80. void GetShortestPaths(int s, int & dist, vector<int>&paths) {
  81. dijkstra(s);
  82. for(int i = n-1; i <n; i++) {
  83. dist = d[i];
  84. paths.clear();
  85. int t = i;
  86. paths.push_back(t);
  87. while(t != s) {
  88. paths.push_back(edges[p[t]].col);
  89. t = edges[p[t]].from;
  90. }
  91. reverse(paths.begin(), paths.end());
  92. }
  93. }
  94. };
  95. Dijkstra solver;
  96. vector <int> path;
  97. int main()
  98. {
  99. int t,ca=1;
  100. scanf("%d",&t);
  101. while(t--)
  102. {
  103.  
  104. scanf("%d%d",&n,&m);
  105. solver.init(n*m+2);
  106. for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&mat[i][j]);
  107. for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
  108. {
  109. for(int k=0;k<3;k++)
  110. {
  111. int x=i+ddd[k][0];
  112. int y=j+ddd[k][1];
  113. if(!jude(x,y)) continue;
  114. solver.AddEdge(ID(i,j),ID(x,y),mat[x][y],y);
  115. }
  116. // 上边有个dd 数组 (用dd数组 8-connected 然后K 变成上届8 就可以了 )
  117. }
  118. for(int i=1;i<=m;i++) solver.AddEdge(0,ID(1,i),mat[1][i],i);
  119. for(int i=1;i<=m;i++) solver.AddEdge(ID(n,i),n*m+1,0,105);
  120. int dis=0;
  121. solver.GetShortestPaths(0,dis,path);
  122. printf("Case %d\n",ca++);
  123. for(int i=0;i<path.size()-2;i++)
  124. {
  125. if(i==0) printf("%d",path[i]);
  126. else printf(" %d",path[i]);
  127. }
  128. puts("");
  129. }
  130. return 0;
  131. }

  

hdu 5092 Seam Carving的更多相关文章

  1. HDU 5092 Seam Carving (dp)

    题意,给一个数字矩阵,要求从上往下的一条路径,使这条路径上数字之和最小,如有多条输出最靠右的一条. 数字三角形打印路径... 一般打印路径有两种选择,一是转移的时候加以记录,二是通过检查dp值回溯. ...

  2. hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)

    题意: 给一个m*n的矩阵,每格上有一个数. 找从第1行到第m行的一条路径,使得这条路径上的数之和最小. 路径必须满足相邻两行所选的两个数的纵坐标相邻(即一个格子必须是另一个格子的周围八个格子中的一个 ...

  3. 递推DP HDOJ 5092 Seam Carving

    题目传送门 /* 题意:从上到下,找最短路径,并输出路径 DP:类似数塔问题,上一行的三个方向更新dp,路径输出是关键 */ #include <cstdio> #include < ...

  4. hdoj 5092 Seam Carving 【树塔DP变形 + 路径输出】 【简单题】

    Seam Carving Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  5. hdu 5902 Seam Carving

    水题,直接上代码了 #include<cstdio> #include<cstring> #include<iostream> #include<cmath& ...

  6. HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)

    Seam Carving DescriptionFish likes to take photo with his friends. Several days ago, he found that s ...

  7. Seam carving 学习笔记

    今天首次接触了图像编辑中的seam carving知识,感觉挺神奇的.虽然我自己可能理解的不是很深刻,但是记录下来,总是好的. seam carving直接翻译过来是“线裁剪”的意思.它的主要用途是对 ...

  8. Programming Assignment 2: Seam Carving

    编程作业二 作业链接:Seam Carving & Checklist 我的代码:SeamCarver.java 问题简介 接缝裁剪(Seam carving),是一个可以针对照片内容做正确缩 ...

  9. HDU 5092

    http://acm.hdu.edu.cn/showproblem.php?pid=5092 卡读题,实质是每行取一个点,从上到下找一条路径权值和最小,点可以到达的地方是周围八个格子 类似数塔的dp, ...

随机推荐

  1. java学习笔记01--数据类型

    java学习笔记01--数据类型 java数据类型划分 分为两大类型: 1)基本数据类型:类似于普通的值. 2)引用数据类型:传递的是内存的地址. 浮点类型实际上就是表示小数. java基本数据类型 ...

  2. Android开发5:布局管理器2(表格布局TableLayout)

    版本:Android4.3 API18  学习整理:liuxinming 概念      TableLayout继承了LinearLayout,因此它的本质依然是线性布局管理器.      表格布局采 ...

  3. hdu 4970 Killing Monsters(数学题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4970 Problem Description Kingdom Rush is a popular TD ...

  4. 在navigationItem中添加搜索栏

    给navigationItem中添加个搜索栏,效果和大部分程序一样.代码如下: UISearchBar *searchBar = [[UISearchBaralloc] initWithFrame:C ...

  5. 公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播

    已经上传到CSDN,下载地址:http://download.csdn.net/detail/avsuper/7421647,不要钱滴,嘿嘿... 本程序能够把摄像头视频和麦克风音频,录制为FLV文件 ...

  6. oracle 之 内存—鞭辟近里(三)

    oracle 之 内存—鞭辟近里(三) 今天是2013-07-08,今天晚上突然接到一个电话,我的外甥问我的qq是多少,我感觉很吃惊,他长大了.在他现在这个年龄就开始接触网络,我难免有少许担心,希望他 ...

  7. ASP.NET MVC的跳转攻击问题

    在ASP.NET MVC的自带的模板代码中,有这样一段,用来拦截非登录用户,使其跳转到登录页面,然后登录后在跳转回原页面.所以,期间有一个returnUrl参数用来保存原页面地址.在Login Act ...

  8. PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()

    PostgreSQL代码分析,查询优化部分. 这里把规范谓词表达式的部分就整理完了,阅读的顺序例如以下: 一.PostgreSQL代码分析,查询优化部分,canonicalize_qual 二.Pos ...

  9. Session为空的一种原因

    在维护一份比较老的代码,想改为ajax调用,然后就添加了一个一般处理程序文件,也就是以.ashx结尾的文件,一切都正常,但发现session一直为空,很奇怪 基本的代码如下: public class ...

  10. jvm理论

    三大流行jvm sun HotSpot ibm j9 BEA JRockit Oracle 会基于HotSpot整合 JRockit. jvm运行时数据区 java虚拟机所管理的内存将会包括以下几个运 ...