HDU 5092 Seam Carving (dp)
2015-07-17 14:01
381 查看
题意,给一个数字矩阵,要求从上往下的一条路径,使这条路径上数字之和最小,如有多条输出最靠右的一条。
数字三角形打印路径。。。
一般打印路径有两种选择,一是转移的时候加以记录,二是通过检查dp值回溯。
数字三角形打印路径。。。
一般打印路径有两种选择,一是转移的时候加以记录,二是通过检查dp值回溯。
#include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn = 100; int g[maxn+2][maxn]; int d[maxn+2][maxn]; int pa[maxn+2][maxn]; int m,n; const int INF = 1e9; void init(){ memset(*pa,-1,sizeof(*pa)); for(int i = 0; i < maxn; i++) d[i][0] = INF; } vector<int> ans; void print_ans(int s){ ans.clear(); ans.push_back(s); for(int i = m-1; i > 0; i--){ s = pa[i][s]; ans.push_back(s); } for(int i = ans.size()-1; i > 0 ;i--){ printf("%d ",ans[i]); } printf("%d\n",ans[0]); } void work() { for(int i = 1; i <= n; i++ ) d[0][i] = g[0][i]; for(int i = 0; i < m; i++){ d[i][n+1] = INF; } for(int i = 1; i < m ;i++){ for(int j = 1; j <= n ; ++j ){ int Min = -1; for(int k = 0; k <=1; k++){ if(d[i-1][j+k] <= d[i-1][j+Min]){ Min = k; } } pa[i][j] = j+Min; d[i][j] = d[i-1][j+Min] + g[i][j]; } } int Min = 0; for(int i = 1; i <= n; i++ ){ if(d[m-1][Min] >= d[m-1][i]){ Min = i; } } print_ans(Min); } int main() { int T; init(); scanf("%d",&T); for(int i = 1; i <= T; i++){ printf("Case %d\n",i); scanf("%d%d",&m,&n); for(int i = 0; i < m; i++) for(int j = 1; j <= n; j++) scanf("%d",g[i]+j); work(); } return 0; }
相关文章推荐
- Css样式之overflow
- 12-低延迟、全接口(HMDI、DVI、YPb Pr、RGB)H.264全高清编码器解码器
- 最近有个需求,就是把某个网址跳转到另外一个网址
- 提高iOS开发效率的方法和工具
- (4.3.1.2)【项目一】主体框架Fragment中启动Service与notification的使用
- 一个程序员的顿悟
- hdu 1008 Elevator
- 代码着色插件 for Windows Live Writer
- 管理后台比较好的U模板
- android intent隐式调用之一个应用程序启动另一个应用程序
- 【VS2010]如何删除【附加依赖项】中“继承的值”?
- java获取取前段页面的参数
- afnetworking2.0源码解析AFURLRequestSerialization
- discuz 上传头像失败解决方法
- yii2CSRF验证
- JAXB注解的使用详解
- 前台传后台参数,其中前台js 后台java处理乱码
- WebView的应用 持续积累
- C++课程实训——银行系统
- 图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)