hdu 5092 Seam Carving
这道题 我没看出来 他只可以往下走,我看到的 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
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <cstring>
- #include <cstdlib>
- #include <iostream>
- #include <set>
- #include <map>
- #include <vector>
- #include <queue>
- #include <string>
- using namespace std;
- int n,m;
- int mat[105][105];
- int dd[][2]={-1,1, -1,0, -1,-1, 0,1, 0,-1, 1,1, 1,0, 1,-1 };
- int ddd[][2]={1,-1,1,0,1,1};
- bool jude(int x,int y)
- {
- return x>=1&&x<=n&&y>=1&&y<=m;
- }
- int ID(int x,int y)
- {
- return (x-1)*m+y;
- }
- const int INF = 1000000000;
- const int maxn =10000+10;
- struct Edge {
- int from, to, dist,col;
- Edge(){}
- Edge(int from,int to,int dist,int col):from(from),to(to),dist(dist),col(col){}
- };
- struct HeapNode {
- int d, u , col;
- HeapNode(){}
- HeapNode(int d,int u,int col):d(d),u(u),col(col){}
- bool operator < (const HeapNode& rhs) const {
- if(d==rhs.d) return col<rhs.col;
- return d > rhs.d;
- }
- };
- struct Dijkstra {
- int n, m;
- vector<Edge> edges;
- vector<int> G[maxn];
- bool done[maxn];
- int d[maxn];
- int p[maxn];
- void init(int n) {
- this->n = n;
- for(int i = 0; i < n; i++) G[i].clear();
- edges.clear();
- }
- void AddEdge(int from, int to, int dist,int col) {
- edges.push_back(Edge(from, to, dist,col));
- m = edges.size();
- G[from].push_back(m-1);
- }
- void dijkstra(int s) {
- priority_queue<HeapNode> Q;
- for(int i = 0; i < n; i++) d[i] = INF;
- d[s] = 0;
- memset(done, 0, sizeof(done));
- Q.push( HeapNode(0, s , 0)) ;
- while(!Q.empty()) {
- HeapNode x = Q.top(); Q.pop();
- int u = x.u;
- if(done[u]) continue;
- done[u] = true;
- for(int i = 0; i < G[u].size(); i++) {
- Edge& e = edges[G[u][i]];
- if(d[e.to] > d[u] + e.dist) {
- d[e.to] = d[u] + e.dist;
- p[e.to] = G[u][i];
- Q.push(HeapNode(d[e.to], e.to, e.col));
- }
- }
- }
- }
- void GetShortestPaths(int s, int & dist, vector<int>&paths) {
- dijkstra(s);
- for(int i = n-1; i <n; i++) {
- dist = d[i];
- paths.clear();
- int t = i;
- paths.push_back(t);
- while(t != s) {
- paths.push_back(edges[p[t]].col);
- t = edges[p[t]].from;
- }
- reverse(paths.begin(), paths.end());
- }
- }
- };
- Dijkstra solver;
- vector <int> path;
- int main()
- {
- int t,ca=1;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&m);
- solver.init(n*m+2);
- for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&mat[i][j]);
- for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
- {
- for(int k=0;k<3;k++)
- {
- int x=i+ddd[k][0];
- int y=j+ddd[k][1];
- if(!jude(x,y)) continue;
- solver.AddEdge(ID(i,j),ID(x,y),mat[x][y],y);
- }
- // 上边有个dd 数组 (用dd数组 8-connected 然后K 变成上届8 就可以了 )
- }
- for(int i=1;i<=m;i++) solver.AddEdge(0,ID(1,i),mat[1][i],i);
- for(int i=1;i<=m;i++) solver.AddEdge(ID(n,i),n*m+1,0,105);
- int dis=0;
- solver.GetShortestPaths(0,dis,path);
- printf("Case %d\n",ca++);
- for(int i=0;i<path.size()-2;i++)
- {
- if(i==0) printf("%d",path[i]);
- else printf(" %d",path[i]);
- }
- puts("");
- }
- return 0;
- }
hdu 5092 Seam Carving的更多相关文章
- HDU 5092 Seam Carving (dp)
题意,给一个数字矩阵,要求从上往下的一条路径,使这条路径上数字之和最小,如有多条输出最靠右的一条. 数字三角形打印路径... 一般打印路径有两种选择,一是转移的时候加以记录,二是通过检查dp值回溯. ...
- hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)
题意: 给一个m*n的矩阵,每格上有一个数. 找从第1行到第m行的一条路径,使得这条路径上的数之和最小. 路径必须满足相邻两行所选的两个数的纵坐标相邻(即一个格子必须是另一个格子的周围八个格子中的一个 ...
- 递推DP HDOJ 5092 Seam Carving
题目传送门 /* 题意:从上到下,找最短路径,并输出路径 DP:类似数塔问题,上一行的三个方向更新dp,路径输出是关键 */ #include <cstdio> #include < ...
- hdoj 5092 Seam Carving 【树塔DP变形 + 路径输出】 【简单题】
Seam Carving Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- hdu 5902 Seam Carving
水题,直接上代码了 #include<cstdio> #include<cstring> #include<iostream> #include<cmath& ...
- HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)
Seam Carving DescriptionFish likes to take photo with his friends. Several days ago, he found that s ...
- Seam carving 学习笔记
今天首次接触了图像编辑中的seam carving知识,感觉挺神奇的.虽然我自己可能理解的不是很深刻,但是记录下来,总是好的. seam carving直接翻译过来是“线裁剪”的意思.它的主要用途是对 ...
- Programming Assignment 2: Seam Carving
编程作业二 作业链接:Seam Carving & Checklist 我的代码:SeamCarver.java 问题简介 接缝裁剪(Seam carving),是一个可以针对照片内容做正确缩 ...
- HDU 5092
http://acm.hdu.edu.cn/showproblem.php?pid=5092 卡读题,实质是每行取一个点,从上到下找一条路径权值和最小,点可以到达的地方是周围八个格子 类似数塔的dp, ...
随机推荐
- java学习笔记01--数据类型
java学习笔记01--数据类型 java数据类型划分 分为两大类型: 1)基本数据类型:类似于普通的值. 2)引用数据类型:传递的是内存的地址. 浮点类型实际上就是表示小数. java基本数据类型 ...
- Android开发5:布局管理器2(表格布局TableLayout)
版本:Android4.3 API18 学习整理:liuxinming 概念 TableLayout继承了LinearLayout,因此它的本质依然是线性布局管理器. 表格布局采 ...
- hdu 4970 Killing Monsters(数学题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4970 Problem Description Kingdom Rush is a popular TD ...
- 在navigationItem中添加搜索栏
给navigationItem中添加个搜索栏,效果和大部分程序一样.代码如下: UISearchBar *searchBar = [[UISearchBaralloc] initWithFrame:C ...
- 公布一个软件,轻新视频录播程序,H264/AAC录制视音频,保存FLV,支持RTMP直播
已经上传到CSDN,下载地址:http://download.csdn.net/detail/avsuper/7421647,不要钱滴,嘿嘿... 本程序能够把摄像头视频和麦克风音频,录制为FLV文件 ...
- oracle 之 内存—鞭辟近里(三)
oracle 之 内存—鞭辟近里(三) 今天是2013-07-08,今天晚上突然接到一个电话,我的外甥问我的qq是多少,我感觉很吃惊,他长大了.在他现在这个年龄就开始接触网络,我难免有少许担心,希望他 ...
- ASP.NET MVC的跳转攻击问题
在ASP.NET MVC的自带的模板代码中,有这样一段,用来拦截非登录用户,使其跳转到登录页面,然后登录后在跳转回原页面.所以,期间有一个returnUrl参数用来保存原页面地址.在Login Act ...
- PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
PostgreSQL代码分析,查询优化部分. 这里把规范谓词表达式的部分就整理完了,阅读的顺序例如以下: 一.PostgreSQL代码分析,查询优化部分,canonicalize_qual 二.Pos ...
- Session为空的一种原因
在维护一份比较老的代码,想改为ajax调用,然后就添加了一个一般处理程序文件,也就是以.ashx结尾的文件,一切都正常,但发现session一直为空,很奇怪 基本的代码如下: public class ...
- jvm理论
三大流行jvm sun HotSpot ibm j9 BEA JRockit Oracle 会基于HotSpot整合 JRockit. jvm运行时数据区 java虚拟机所管理的内存将会包括以下几个运 ...