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的更多相关文章

  1. hdu 5092 线裁剪(纵向连线最小和+输出路径)

    http://acm.hdu.edu.cn/showproblem.php?pid=5092 给一个m*n的矩阵,找到一个纵向的"线"使得线上的和最小并输出这条线,线能向8个方向延 ...

  2. hdu 5092 Seam Carving

    这道题 我没看出来 他只可以往下走,我看到的 8-connected :所以今天写一下如果是 8-connected 怎么解: 其实说白了这个就是从上到下走一条线到达最后一行的距离最小: 从Map[a ...

  3. HDU 5092 DP

    DP水题 求从上到下走完,使所取得权值最小,并输出路径,若有多个满足,则输出靠右的 #include "stdio.h" #include "string.h" ...

  4. HDU 5092 Seam Carving (dp)

    题意,给一个数字矩阵,要求从上往下的一条路径,使这条路径上数字之和最小,如有多条输出最靠右的一条. 数字三角形打印路径... 一般打印路径有两种选择,一是转移的时候加以记录,二是通过检查dp值回溯. ...

  5. hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)

    题意: 给一个m*n的矩阵,每格上有一个数. 找从第1行到第m行的一条路径,使得这条路径上的数之和最小. 路径必须满足相邻两行所选的两个数的纵坐标相邻(即一个格子必须是另一个格子的周围八个格子中的一个 ...

  6. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  8. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  9. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. Java 正则表达式 向前、向后匹配

    //向后匹配 String a = "I paid $90 for 10 oranges, 12 pears and 8 apples. I saved $5 on "; Patt ...

  2. 生成json对象

    JSONObject 对于放入的object,最终生成的json是什么样的? 两个JavaBean: public class ClassBean { private int grade; priva ...

  3. Objective-C(NSString、BOOL、多文件开发)

    NSString 表示oc当中的字符串类 %@是oc当中对象的格式符 printf不能打印oc当中的对象 通过stringWithFormat:这个类方法,打印格式化的字符串 例 int a = 10 ...

  4. 一步一步配置NLB(续)之深入测试

    在这里http://blog.csdn.net/haoxiaozigang1/article/details/12198679跟大家分享了NLB配置的过程,下面写一些对NLB不同情况的下测试的结果: ...

  5. Linux系统中的日常监控知识点

    1.命令熟悉之w [xiongchao@oc3006745124 Desktop]$ w :: up :, users, load average: 1.48, 1.19, 1.11 USER TTY ...

  6. jquery删除原事件

    $(document).ready(function(){ var fn = $("#exportCsv").attr( "onclick" ); // 获取原 ...

  7. bzoj 2282: [Sdoi2011]消防

    #include<cstdio> #include<cstring> #include<iostream> #define N 600000 using names ...

  8. invalid types 'int[int]' for array subscrip

    定义重复 如 一个int r 与一个 r[i] 重复

  9. Android 系统基础

    当系统启动一个组件,它其实就启动了这个程序的进程(如果这个进程还未被启动的话)并实例化这个组件所需要的类. 例如,如果你的程序启动了相机程序里的activity去拍照,这个activity实际上是运行 ...

  10. Xlistview的values下的界面

    <!-- 下拉刷新,上拉加载更多 -->    <string name="xlistview_header_hint_normal">下拉刷新</s ...