HDU 5092
http://acm.hdu.edu.cn/showproblem.php?pid=5092
卡读题,实质是每行取一个点,从上到下找一条路径权值和最小,点可以到达的地方是周围八个格子
类似数塔的dp,需要记录路径,当前行由上一行顶上的三个格子转移而来
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#include <stack> using namespace std;
int n,m;
int a[][],dp[][],pre[][];
int dx[]={-,-,-};
int dy[]={,,-}; struct node{
int x,y;
}; int main(){
int T;
scanf("%d",&T);
for(int cas=;cas<=T;cas++){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=;i<;i++)
for(int j=;j<;j++)
dp[i][j]=0xfffffff;
for(int i=;i<=m;i++)
dp[][i]=a[][i];
memset(pre,-,sizeof(pre));
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(j->= && j+<=m){
//dp[i][j]=min(dp[i][j],a[i][j]+min(dp[i-1][j],min(dp[i-1][j-1],dp[i-1][j+1])));
int t=min(dp[i-][j],min(dp[i-][j-],dp[i-][j+]));
if(a[i][j]+t<dp[i][j]){
dp[i][j]=a[i][j]+t;
if(dp[i-][j+]<=dp[i-][j-] && dp[i-][j+]<=dp[i-][j])
pre[i][j]=;
else if(dp[i-][j]<=dp[i-][j-] && dp[i-][j]<=dp[i-][j+])
pre[i][j]=;
else pre[i][j]=;
}
}
else if(j->=){
//dp[i][j]=min(dp[i][j],a[i][j]+min(dp[i-1][j],dp[i-1][j-1]));
int t=min(dp[i-][j],dp[i-][j-]);
if(a[i][j]+t<dp[i][j]){
dp[i][j]=a[i][j]+t;
if(dp[i-][j]<=dp[i-][j-])
pre[i][j]=;
else pre[i][j]=;
}
}
else if(j+<=m){
//dp[i][j]=min(dp[i][j],a[i][j]+min(dp[i-1][j],dp[i-1][j+1]));
int t=min(dp[i-][j],dp[i-][j+]);
if(a[i][j]+t<dp[i][j]){
dp[i][j]=a[i][j]+t;
if(dp[i-][j+]<=dp[i-][j])
pre[i][j]=;
else pre[i][j]=;
}
}
}
}
int ans=0xfffffff;
int res;
for(int i=;i<=m;i++){
//ans=min(ans,dp[n][i]);
if(ans>=dp[n][i]){
ans=dp[n][i];
res=i;
}
}
printf("Case %d\n",cas);
stack <node> s;
node st;
st.x=n;st.y=res;
s.push(st);
while(){
if(st.x==)break;
int xx=st.x+dx[pre[st.x][st.y]];
int yy=st.y+dy[pre[st.x][st.y]];
st.x=xx;st.y=yy;
s.push(st);
}
for(int i=;i<=n;i++){
if(i==)printf("%d",s.top().y);
else printf(" %d",s.top().y);
s.pop();
}
putchar('\n');
}
return ;
}
HDU 5092的更多相关文章
- hdu 5092 线裁剪(纵向连线最小和+输出路径)
http://acm.hdu.edu.cn/showproblem.php?pid=5092 给一个m*n的矩阵,找到一个纵向的"线"使得线上的和最小并输出这条线,线能向8个方向延 ...
- hdu 5092 Seam Carving
这道题 我没看出来 他只可以往下走,我看到的 8-connected :所以今天写一下如果是 8-connected 怎么解: 其实说白了这个就是从上到下走一条线到达最后一行的距离最小: 从Map[a ...
- HDU 5092 DP
DP水题 求从上到下走完,使所取得权值最小,并输出路径,若有多个满足,则输出靠右的 #include "stdio.h" #include "string.h" ...
- HDU 5092 Seam Carving (dp)
题意,给一个数字矩阵,要求从上往下的一条路径,使这条路径上数字之和最小,如有多条输出最靠右的一条. 数字三角形打印路径... 一般打印路径有两种选择,一是转移的时候加以记录,二是通过检查dp值回溯. ...
- hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)
题意: 给一个m*n的矩阵,每格上有一个数. 找从第1行到第m行的一条路径,使得这条路径上的数之和最小. 路径必须满足相邻两行所选的两个数的纵坐标相邻(即一个格子必须是另一个格子的周围八个格子中的一个 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- sql 语句 截取字符串的两种方案
方案一:使用内置的函数 SUBSTRING,CHARINDEX,LEN三个内置函数 理论: SUBSTRING语法 SUBSTRING ( value_expression , start_exp ...
- Java 迭代器理解
1.Iterator(迭代器) 作为一种设计模式,迭代器可以用于遍历一个对象,对于这个对象的底层结构不必去了解. java中的Iterator一般称为“轻量级”对象,创建它的代价是比较小的.这里笔者不 ...
- if条件语句
第四天 XMind 思维导图复习之前知识 数据类型-变量常量-运算符(表达式)-语句(顺序.分支.循环)-数组-函数 1.if语句格式 if(表达式) { 语句 } 注意: 1.如果,表达式成立,只执 ...
- Your content must have a ListView whose id attribute is 'android.R.id.list'
修改ListView的ID为 ' @android:id/list ' <ListView android:id="@android:id/list" android:lay ...
- ThinkPHP中数据库操作返回值总结
转自:http://www.baiwar.com/post/thinkphp-database-operations-in-the-return-value.html Thinkphp中的Think\ ...
- HADOOP :: java.lang.ClassNotFoundException: WordCount
I am using eclipse to export the jar file of a map-reduce program. When i am run the jar using comma ...
- Servlet+JSP+JavaBean开发模式(MVC)介绍
好伤心...写登陆注册之前看见一篇很好的博文,没有收藏,然后找不到了. 前几天在知乎上看见一个问题,什么时候感觉最无力. 前两天一直想回答:尝试过google到的所有solve case,结果bug依 ...
- zabbix3.0部署(LAMP)
0.1 初始化 #!/bin/sh yum clean all systemctl stop firewalld.service systemctl disable firewalld.service ...
- js获取URL地址中的GET参数
var $_GET = (function(){ var url = window.document.location.href.toString(); var u = url.split(" ...
- plist 和 Xib
plist文件 mainbudin加载时候有后缀 xib文件 mainbudin加载时候无需后缀