Hdu 5092 Seam Carving(dp)
2014-11-02 20:24
375 查看
题目链接
Total Submission(s): 54 Accepted Submission(s): 30
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
[align=left]Source[/align]
2014上海全国邀请赛——题目重现(感谢上海大学提供题目)
题解:简单dp,代码如下:
Seam Carving
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 54 Accepted Submission(s): 30
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
Case 1 2 1 1 2 Case 2 3 2 1 1 2 1
[align=left]Source[/align]
2014上海全国邀请赛——题目重现(感谢上海大学提供题目)
题解:简单dp,代码如下:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<vector> #include<queue> #include<map> #include<stack> #define nn 110 #define inff 0x3fffffff using namespace std; int n,m; int dp[nn][nn],pre[nn][nn]; int a[nn][nn]; int dir[3][2]={1,-1,1,0,1,1}; stack<int>sta; int main() { int i,t,j,k; int cas=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { dp[i][j]=inff; scanf("%d",&a[i][j]); } } for(i=1;i<=m;i++) dp[1][i]=a[1][i]; int dx,dy; for(i=1;i<n;i++) { for(j=1;j<=m;j++) { for(k=0;k<3;k++) { dx=dir[k][0]+i,dy=dir[k][1]+j; if(dx>=1&&dx<=n&&dy>=1&&dy<=m) { if(dp[i][j]+a[dx][dy]<dp[dx][dy]) { dp[dx][dy]=dp[i][j]+a[dx][dy]; pre[dx][dy]=k; } else if(dp[i][j]+a[dx][dy]==dp[dx][dy]) pre[dx][dy]=k; } } } } int ans=inff; int id=-1; for(i=m;i>=1;i--) { if(dp [i]<ans) { ans=dp [i]; id=i; } } printf("Case %d\n",cas++); int ix=n; while(ix) { sta.push(id); id=id-dir[pre[ix][id]][1]; ix--; } bool ok=true; while(sta.size()) { if(ok) ok=false; else printf(" "); printf("%d",sta.top()); sta.pop(); } puts(""); } return 0; }
相关文章推荐
- HDU 5092 Seam Carving (dp)
- hdu 5092 Seam Carving(dp)
- hdu 5092 Seam Carving 简单DP ”水一炮试试“大法
- hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)
- HDU 5092 Seam Carving (DP+打印路径)
- HDU 5092 Seam Carving(上海邀请赛基础DP)
- 【DP】 HDU 5092 Seam Carving
- HDU 5092 Seam Carving(DP)
- 【DP】 HDU 5092 Seam Carving
- hdu 5092 Seam Carving(DP+记录路径)
- HDU 5092 Seam Carving(DP, 路径)
- HDU 5092 DP
- [HDOJ5092] Seam Carving(DP,记录路径)
- HDU5092——DP+递归输出——Seam Carving
- hdu 5092 Seam Carving dp+记录路径
- hdoj5092Seam Carving【dp】
- HDU 5092 Seam Carving DP
- hdu 5092 dp
- 递推DP HDOJ 5092 Seam Carving
- hdu 5092 Seam Carving