HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)
Seam Carving
Description
Fish likes to take photo with his friends. Several days ago, he found that some pictures of him were damaged. The trouble is that there are some seams across the pictures. So he tried to repair these pictures. He scanned these pictures and stored them in his computer. He knew it is an effective way to carve the seams of the images He only knew that there is optical energy in every pixel. He learns the following principle of seam carving. Here seam carving refers to delete through horizontal or vertical line of pixels across the whole image to achieve image scaling effect. In order to maintain the characteristics of the image pixels to delete the importance of the image lines must be weakest. The importance of the pixel lines is determined in accordance with the type of scene images of different energy content. That is, the place with the more energy and the richer texture of the image should be retained. So the horizontal and vertical lines having the lowest energy are the object of inspection. By constantly deleting the low-energy line it can repair the image as the original scene.
For an original image G of m*n, where m and n are the row and column of the image respectively. Fish obtained the corresponding energy matrix A. He knew every time a seam with the lowest energy should be carved. That is, the line with the lowest sum of energy passing through the pixels along the line, which is a 8-connected path vertically or horizontally.
Here your task is to carve a pixel from the first row to the final row along the seam. We call such seam a vertical seam.
Input
There several test cases. The first line of the input is an integer T, which is the number of test cases, 0<T<=30. Each case begins with two integers m, n, which are the row and column of the energy matrix of an image, (0<m,n<=100). Then on the next m line, there n integers.
Output
For each test case, print “Case #” on the first line, where # is the order number of the test case (starting with 1). Then print the column numbers of the energy matrix from the top to the bottom on the second line. If there are more than one such seams, just print the column number of the rightmost seam.
Sample Input
2
4 3
55 32 75
17 69 73
54 81 63
47 5 45
6 6
51 57 49 65 50 74
33 16 62 68 48 61
2 49 76 33 32 78
23 68 62 37 69 39
68 59 77 77 96 59
31 88 63 79 32 34
Sample Output
Case 1
2 1 1 2
Case 2
3 2 1 1 2 1
题目大意:
给你一个n*m的矩阵,求一条路径从第1到第n行使其经过的和最小,每个位置a[i][j]只能走三个点:a[i+1][j-1],a[i+1][j],a[i+1][j+1],打印出路径,即每行的列数。
题目要求路径要字典序最大。
解题思路:
dp[i][j]=max(dp[i-1][j]+data[i][j],dp[i-1][j-1]+data[i][j],dp[i-1][j+1]+data[i][j])
注意该题如果有相同大小的结果,输出最右的。
dp数组建立的时候应该按dp[i-1][j+1],dp[i-1][j],dp[i-1][j-1]的顺序以绝对大于来比较。这样可以保证最终结构为最右。
建立back[][]数组来保存路径。back[i][j]=a,表示dp[i][j]是使用第i-1行a列的数据构成的。
Code:
/*************************************************************************
> File Name: shanghai_1003.cpp
> Author: Enumz
> Mail: 369372123@qq.com
> Created Time: 2014年11月05日 星期三 16时14分02秒
************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<list>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<bitset>
#include<climits>
#define MAXN 1000
using namespace std;
int back[MAXN][MAXN],dp[MAXN][MAXN],data[MAXN][MAXN];
int ans[MAXN],M,N;
int main()
{
int T,times=;
cin>>T;
while (T--)
{
memset(dp,,sizeof(dp));
memset(back,,sizeof(back));
cin>>M>>N;
for (int i=;i<=M;i++)
for (int j=;j<=N;j++){
scanf("%d",&data[i][j]);
dp[i][j]=;
}
for (int i=;i<=N;i++)
dp[][i]=data[][i];
for (int i=;i<=M;i++)
for (int j=;j<=N;j++)
{
if (j+<=N&&dp[i][j]>dp[i-][j+]+data[i][j])
dp[i][j]=dp[i-][j+]+data[i][j],back[i][j]=j+;
if (dp[i][j]>dp[i-][j]+data[i][j])
dp[i][j]=dp[i-][j]+data[i][j],back[i][j]=j;
if (j->=&&dp[i][j]>dp[i-][j-]+data[i][j])
dp[i][j]=dp[i-][j-]+data[i][j],back[i][j]=j-;
}
int min=,min_i=;
for (int i=N;i>=;i--){
if(min>dp[M][i]) min=dp[M][i],min_i=i;
}
printf("Case %d\n",times++);
for (int i=M;i>=;i--)
{
ans[i]=min_i;
min_i=back[i][min_i];
}
for (int i=;i<=M;i++)
{
printf("%d",ans[i]);
if(M==i) printf("\n");
else printf(" ");
} }
return ;
}
HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)的更多相关文章
- HDU5093——Battle ships(最大二分匹配)(2014上海邀请赛重现)
Battle ships Problem DescriptionDear contestant, now you are an excellent navy commander, who is res ...
- HDU5099——Comparison of Android versions(简单题)(2014上海邀请赛重现)
Comparison of Android versionsProblem DescriptionAs an Android developer, itˇs really not easy to fi ...
- HDU5090——Game with Pearls(匈牙利算法|贪心)(2014上海邀请赛重现)
Game with Pearls Problem DescriptionTom and Jerry are playing a game with tubes and pearls. The rule ...
- Seam carving 学习笔记
今天首次接触了图像编辑中的seam carving知识,感觉挺神奇的.虽然我自己可能理解的不是很深刻,但是记录下来,总是好的. seam carving直接翻译过来是“线裁剪”的意思.它的主要用途是对 ...
- UVA LA 7146 2014上海亚洲赛(贪心)
option=com_onlinejudge&Itemid=8&page=show_problem&category=648&problem=5158&mosm ...
- Programming Assignment 2: Seam Carving
编程作业二 作业链接:Seam Carving & Checklist 我的代码:SeamCarver.java 问题简介 接缝裁剪(Seam carving),是一个可以针对照片内容做正确缩 ...
- [POI 2001+2014acm上海邀请赛]Gold Mine/Beam Cannon 线段树+扫描线
Description Byteman, one of the most deserving employee of The Goldmine of Byteland, is about to re ...
- 递推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 ...
随机推荐
- 第三次作业,github的基本操作
chengjiangtao@pc MINGW32 ~$ git config --global user.name "chengjiangtao" chengjiangtao@pc ...
- SQL中的5种聚集函数
作为一个刚毕业进入这行的菜鸟,婶婶的觉的那种大神.大牛到底是怎样炼成的啊,我这小菜鸟感觉这TMD要学的东西这多啊,然后就给自己定了许多许多要学习的东西,可是有人又不停地给你灌输:东西不在多而要精通!我 ...
- 向Array中添加归并排序
归并排序思路 1) 归并 从两个有序表R[low...mid]和R[mid+1...high],每次从左边依次取出一个数进行比较,将较小者放入tmp数组中,最后将两段中剩下的部分直接复制到tmp中. ...
- Django RequestContext用法
模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把user放到context中. from d ...
- HBAO
nv算是坑死我了,之前下的hbao的sample这次怎么都找不到 http://developer.download.nvidia.com/SDK/10.5/direct3d/samples.html ...
- 自定义对话框 提示:Unable to add window token null is not for an application
这是因为在new Dialog(context);的时候传入的context是通过getApplicationContext()获得的,这样就会报错. 把context的获得方式改为MainActiv ...
- 一套名企WEB前端面试题,不提供答案
1.说说你对Doctype的理解 2.web产品开发的流程 3.说说你对盒子模型的理解 4.前端页面有哪三层构成,分别是什么?作用是什么? 5.行内元素有哪些?块级元素有哪些?他们如何相互转化? 6. ...
- 使用Rails 4.2+ 测试异步邮件系统
[导读]异步测试总是一个很大的问题,邮件发送测试更是让很多开发同学不知道从哪里入手.在新版的Rails里,这类测试在很大程度上被简化了. 以下为译文 在编写需要发送邮件的应用时,控制器是绝不能被阻塞的 ...
- Acdream1217 Cracking' RSA(高斯消元)
题意:给你m个数(m<=100),每个数的素因子仅来自于前t(t<=100)个素数,问这m个数的非空子集里,满足子集里的数的积为完全平方数的有多少个. 一开始就想进去里典型的dp世界观里, ...
- java 静态构造函数
在java中貌似是没有静态构造函数的. 不过用下面的方式同样可以实现效果. static { }//end 这是静态代码块