递推DP HDOJ 5092 Seam Carving
2024-09-30 07:06:13
/*
题意:从上到下,找最短路径,并输出路径
DP:类似数塔问题,上一行的三个方向更新dp,路径输出是关键
*/
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <ctime>
#include <cstdlib>
using namespace std; const int MAXN = 1e2 + ;
const int INF = 0x3f3f3f3f;
int a[MAXN][MAXN];
int dp[MAXN][MAXN];
int pre[MAXN][MAXN]; void print(int x, int y)
{
if (x == )
{
printf ("%d", y); return ;
}
print (x - , pre[x][y]);
printf (" %d", y);
} int main(void) //HDOJ 5092 Seam Carving
{
//freopen ("C.in", "r", stdin); int n, m, t, cas = ;
scanf ("%d", &t);
while (t--)
{
scanf ("%d%d", &n, &m);
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j) scanf ("%d", &a[i][j]);
memset (pre, , sizeof (pre)); for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j) dp[i][j] = INF;
for (int i=; i<=m; ++i) dp[][i] = a[][i]; for (int i=; i<=n; ++i)
{
for (int j=m; j>=; --j)
{
for (int k=; k>=-; --k)
{
if (j + k < || j + k > m) continue;
if (dp[i][j] > dp[i-][j+k] + a[i][j])
{
dp[i][j] = dp[i-][j+k] + a[i][j];
pre[i][j] = j + k;
}
}
}
} int k = m; int mn = dp[n][m];
for (int i=m-; i>=; --i)
{
if (mn > dp[n][i]) {mn = dp[n][i]; k = i;}
} printf ("Case %d\n", ++cas);
print (n, k);
puts ("");
} return ;
} /*
Case 1
2 1 1 2
Case 2
3 2 1 1 2 1
*/
最新文章
- iOS10 权限崩溃问题
- MIT 6.828 JOS学习笔记5. Exercise 1.3
- 使用PHPUnit + Selenium进行自动化测试
- Android权限安全(2)给基本组件自定义权限(以activity为例)
- 线程入门之start()和run()的区别
- grep恢复误删除文件内容(转)
- JUnit扩展:引入新注解Annotation
- 【HDOJ】2395 Alarm Clock
- VB编写的验证码生成器
- openstack windows 2008 img
- JAVA之File类创建对象构造函数传参数需要注意的几点
- 我是如何同时拿到阿里和腾讯offer的
- yii migrate 设计博客
- IEcss样式,行高的问题
- Android Studio 或 IntelliJ IDEA获取数字签名的方法
- 敦泰FT6X06单层自容调屏
- Nodejs的安装配置及如何在sublimetext2中运行js
- C语言 Struct 结构体在 Java 中的体现
- Ignite(二): 架构及工具
- 关于LaTeX公式排版