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 ...
随机推荐
- windows多线程编程(一)(转)
源出处:http://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022036.html CreateThread:Windows的API函数(SDK函 ...
- 项目中添加Log4J支持
首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Append ...
- 四则运算2--设计思路--软件工程-c++
1.题目避免重复. 2.可定制(数量 打印方式). 3.可以控制下列参数:是否有乘除法.是否有括号.数值范围.加减有无负数.除法有无余数.是否支持分数(真分数,假分数...).是否支持小数(精确到多少 ...
- GCC笔记
The History of GCC 1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可 ...
- 浅谈IT
在没有学计算机应用技术之前我对IT的认知度几乎为零,曾经还天真的认为IT就是白领,只要做上IT行业,以后便可高枕无忧.后来阴差阳错学了这个专业.通过一年的学习,虽然学艺不精但多少对IT行业了解的一知半 ...
- HDU 5597 GTW likes function 欧拉函数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5597 题意: http://bestcoder.hdu.edu.cn/contests/contes ...
- 版本控制 - SVN/TortoiseSVN
研读了blog: 1. http://www.open-open.com/lib/view/open1346982569725.html 2. http://www.360doc.com/conte ...
- JavaScript之match()方法讲解
定义和用法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. ...
- uiview 单边圆角或者单边框
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(120, 10, 80, 80)]; view2.backgroundColor = ...
- jquery 插件开发及extend
以下信息是在看了IBM上的一篇文章(使用 jQuery(中级),第 2 部分: 创建自己的插件)http://www.ibm.com/developerworks/cn/web/wa-aj-jquer ...