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 ...
随机推荐
- 语句--分支语句if case
语句是指程序命令,都是按照顺序执行的.语句在程序中的执行顺序称为“控制流”或者“执行流”.根据程序对运行时所收到的输入的响应,在程序每次运行时控制流可能有所不同. 语句可以嵌套,可以是以分号结尾的单行 ...
- 137. Single Number II——问题是查找,本质是hash查找,只是记录的是32 bit中各个位出现次数而已
Given an array of integers, every element appears three times except for one. Find that single one. ...
- input[type=text]点击之后无边框, 一进页面就显示光标
1.input[type=text]点击之后无边框 :outline:none; 2. 一进页面就显示光标: <script Language="javascript"> ...
- 转 Warning:MongoDB Replica Sets配置注意事项
我们知道,MongoDB不提供单机的数据安全性,取而代之的是提供了Replica Sets的高可用方案.官方文档中提到的案例是三个节点组成的Replica Sets,这样在其中任何一个节点宕机后都会自 ...
- Protocol Buffers in HBase
For early Hbase developers, it is often a nightmare to understand how the different modules speak am ...
- 两个activity之间传递数据用startActivityForResult方法。
package com.example.testactivityresquest; import android.app.Activity; import android.content.Intent ...
- [转载]Android.mk简介
2013-12-23 11:26:54 转载自: http://blog.sina.com.cn/s/blog_67d8d7060100q8un.html 请到转载地址阅读原文, 转载以备查询.
- 启动BPM的5个步骤
在大部分业务中,我们通常认为:一个主要的业务流程管理项目从设计时间开始会比较好.我们知道很多方式来提高效率,增加生产力以及简化我们员工的工 作 - 这正是业务流程管理所做的.不幸的是,不管我们意图多好 ...
- CodeForces 468A Program F
Description Little X used to play a card game called "24 Game", but recently he has found ...
- JS事件大全
橙色表示“非常常用” 绿色表示“常用” onClick IE3|N2|O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDblClick IE4|N4|O 鼠标双击事件 onMouseD ...