HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)
2014-11-05 17:48
369 查看
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:
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=1; cin>>T; while (T--) { memset(dp,0,sizeof(dp)); memset(back,0,sizeof(back)); cin>>M>>N; for (int i=1;i<=M;i++) for (int j=1;j<=N;j++){ scanf("%d",&data[i][j]); dp[i][j]=1000000; } for (int i=1;i<=N;i++) dp[1][i]=data[1][i]; for (int i=2;i<=M;i++) for (int j=1;j<=N;j++) { if (j+1<=N&&dp[i][j]>dp[i-1][j+1]+data[i][j]) dp[i][j]=dp[i-1][j+1]+data[i][j],back[i][j]=j+1; if (dp[i][j]>dp[i-1][j]+data[i][j]) dp[i][j]=dp[i-1][j]+data[i][j],back[i][j]=j; if (j-1>=1&&dp[i][j]>dp[i-1][j-1]+data[i][j]) dp[i][j]=dp[i-1][j-1]+data[i][j],back[i][j]=j-1; } int min=1000000,min_i=0; for (int i=N;i>=1;i--){ if(min>dp[M][i]) min=dp[M][i],min_i=i; } printf("Case %d\n",times++); for (int i=M;i>=1;i--) { ans[i]=min_i; min_i=back[i][min_i]; } for (int i=1;i<=M;i++) { printf("%d",ans[i]); if(M==i) printf("\n"); else printf(" "); } } return 0; }
相关文章推荐
- hdu 5092 Seam Carving 2014上海全国邀请赛——题目重现
- HDU 5097 Page Rank(矩阵模拟)——2014上海全国邀请赛——题目重现(感谢上海大学提供题目)
- HDU5099——Comparison of Android versions(简单题)(2014上海邀请赛重现)
- HDU5093——Battle ships(最大二分匹配)(2014上海邀请赛重现)
- hdu 5090 Game with Pearls 2014上海全国邀请赛——题目重现
- 2014上海全国邀请赛1003(hdu 5092)
- 【HDU】2014上海全国邀请赛——题目重现(感谢上海大学提供题目) 题解
- HDU 5092 Seam Carving(上海邀请赛基础DP)
- HDU5092 Seam Carving(2014上海全国邀请赛——题目重现)(DP)
- 2014上海全国邀请赛(hdu 5090 - 5099)dp+线段树+拓扑排序+bfs(状态压缩)
- HDU5090——Game with Pearls(匈牙利算法|贪心)(2014上海邀请赛重现)
- hdu 5047 Sawtooth--2014acm上海赛区邀请赛(附java模板)
- HDU 5093Battle ships(2014上海邀请赛)
- 2014上海全国邀请赛1006(hdu 5095)
- 2014上海全国邀请赛1010(hdu 5099)
- 2014上海全国邀请赛——题目重现 4.24
- 2014上海全国邀请赛1001(hdu 5090)
- [HDU 4848][2014西安全国邀请赛]Wow! Such Conquering!
- HDU 5115 Dire Wolf (2014ACM亚洲区域赛北京赛区重现)D
- 2014ACM/ICPC亚洲区北京站-重现赛 K(hdu 5122)