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 ...
随机推荐
- express+nodecoffee写passport登录验证实例(一)
项目中要用到passport登录验证,环境如标题样:express框架,coffee模版引擎,node后台 一:建项目 直接用express命令建,虽然默认模版为jade,可以手动换成coffee哦. ...
- lucene索引文件格式
转自:http://blog.csdn.net/whuqin 本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含 ...
- java 面向对象编程--第17章 I/O系统
1.I/O操作指的是输入和输出流的操作.相对内存而言,当我们从数据源中将数据读取到内存中,就是输入流,也叫读取流.当我们将内存中处理好的数据写入数据源,就是输出流,也叫写入流. 2.流按照内容分类:字 ...
- 发送有序广播Ordered Broadcast
import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.vi ...
- 铁人系列 (1) uva 10385
uva 10385 列出n-1个一元方程,对应成单峰函数,所以用三分求解即可. #include <cstdio> #include <cstring> #include & ...
- Android窃取用户信息新思路
0×01 我们能得到哪些android手机上的app敏感信息手机上的app敏感信息◦通讯录,通讯记录,短信◦各种app的帐号密码,输入信息资料等◦各种影音资料,照片资料◦等等0×02 我们有哪些方法 ...
- flash builder的编译缓存
C:\Users\Administrator\AppData\Roaming 因为我的一个项目是手机.浏览器都支持的项目,所以我经常删除项目然后修改成别的类型: 可能是这个原因,导致我的程序或者加载的 ...
- POJ 1083 Moving Tables 思路 难度:0
http://poj.org/problem?id=1083 这道题题意是有若干段线段,每次要求线段不重叠地取,问最少取多少次. 因为这些线段都是必须取的,所以需要让空隙最小 思路: 循环直到线段全部 ...
- Python背景色与语法高亮主题配置
使用python idle的人恐怕都无法忍受默认的白色背景,及其语法高亮主题. 大家更倾向于使用黑色背景. 用户目录 的.idlerc 目录: 下面的各个系统下对应的该文件的位置: 在Linux系列系 ...
- C#同一位置切换显示两个Panel内容
如果两个panel重合在一起,点击不同按钮切换显示不同的panel,需要xxx.BringToFront(); 1.首先让两个panel的visible都为false, 在加载页面load方法里可以让 ...