HDU 5092 Seam Carving(DP)
2014-11-15 17:20
232 查看
题目:Seam Carving
题意:描述得有点晦涩,最后理解下来就是给一个m行n列的矩阵,要每行选一个数字出来,并且每行(第一行是任意选)选择的数字的位置必须是上一行选择的数字的左下、正下或右下的数字。求所有数字加起来和最小的方案,输出方案。多种方案取位置靠右的方案。
按照数字三角形那个模型DP,然后同等大小时选择靠右的方案就行。
dp[i][j] = min(dp[i+1][j-1], dp[i+1][j], dp[i+1][j+1]) + a[i][j];
a[i][j]为第i行第j列的数字。
dp[i][j]为从下往上到dp[i][j]为止的最优值,第0行为最顶上的行。
题意:描述得有点晦涩,最后理解下来就是给一个m行n列的矩阵,要每行选一个数字出来,并且每行(第一行是任意选)选择的数字的位置必须是上一行选择的数字的左下、正下或右下的数字。求所有数字加起来和最小的方案,输出方案。多种方案取位置靠右的方案。
按照数字三角形那个模型DP,然后同等大小时选择靠右的方案就行。
dp[i][j] = min(dp[i+1][j-1], dp[i+1][j], dp[i+1][j+1]) + a[i][j];
a[i][j]为第i行第j列的数字。
dp[i][j]为从下往上到dp[i][j]为止的最优值,第0行为最顶上的行。
#include<cstdio> #include<cstring> const int N = 110; int T, n, m, a , dp , nxt ; int main(){ scanf("%d", &T); for(int t=1; t<=T; t++){ scanf("%d %d", &n, &m); for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++) scanf("%d", &a[i][j]); } for(int j=1; j<=m; j++) dp [j] = a [j]; for(int i=n-1; i>=1; i--){ for(int j=1; j<=m; j++){ dp[i][j] = dp[i+1][j]; nxt[i][j] = j; if(j>1 && dp[i+1][j-1]<dp[i][j]){ dp[i][j] = dp[i+1][j-1]; nxt[i][j] = j-1; } if(j<m && dp[i+1][j+1]<=dp[i][j]){ dp[i][j] = dp[i+1][j+1]; nxt[i][j] = j+1; } dp[i][j]+=a[i][j]; } } int ans = dp[1][1]; int k; for(int i=2; i<=m; i++){ if(dp[1][i]<=ans){ ans = dp[1][i]; k = i; } } printf("Case %d\n%d", t, k); for(int i=1; i<n; i++){ k = nxt[i][k]; printf(" %d", k); } 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, 路径)
- hdu 5092 Seam Carving(DP+记录路径)
- HDU 5092 Seam Carving(上海邀请赛基础DP)
- 【DP】 HDU 5092 Seam Carving
- 【DP】 HDU 5092 Seam Carving
- 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 Seam Carving
- 递推DP HDOJ 5092 Seam Carving
- hdu 5092 Seam Carving