http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18206

题意:M*N的数阵,从左边一列到右边一列走过的数的和的最小。并输出路径和最小值,每一个数能右上,右,右下三种决策,第一行右上是第m行,第m行右下是第1行。

dp【i】【j】存i行j列到最后一列的和的最小,然后逆推,输出路径,就从第一列找最小的dp,然后减去这个数,找右上,右,右下相等的dp,同时行数还得是最小的,思路还是很好想的。做的就是有点麻烦

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int INF = 0x3f3f3f3f;
int a[][],dp[][];
int main()
{
int n,m;
while(scanf("%d%d", &m, &n) != EOF)
{
memset(a, INF, sizeof(a));
for(int i = ; i <= m; i++)
{
for(int j = ; j <= n; j++)
{
scanf("%d", &a[i][j]);
}
} memset(dp, INF, sizeof(dp));
for(int i = ; i <= m; i++)
dp[i][n] = a[i][n]; for(int j = n - ; j >= ; j--)
{
for(int i = ; i <= m; i++)
{
if(i == )
{
dp[i][j] = min(dp[i][j], a[i][j] + dp[m][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i + ][j + ]);
}
else if(i == m)
{
dp[i][j] = min(dp[i][j], a[i][j] + dp[i - ][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[][j + ]);
}
else
{
dp[i][j] = min(dp[i][j], a[i][j] + dp[i - ][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i][j + ]);
dp[i][j] = min(dp[i][j], a[i][j] + dp[i + ][j + ]);
}
}
} int start;
int ans = INF;
for(int i = ; i <= m; i++)
{
if(ans > dp[i][])
{
ans = dp[i][];
start = i;
}
} for(int j = ; j <= n; j++)
{
printf("%d ",start);
int minn = INF;
if(start == )
{
if(dp[start][j - ] - a[start][j - ] == dp[m][j])
{
minn = min(m, minn);
}
if(dp[start][j - ] - a[start][j - ] == dp[start][j])
{
minn = min(start, minn);
}
if(dp[start][j - ] - a[start][j - ] == dp[start + ][j])
{
minn = min(start + , minn);
}
start = minn;
continue;
}
else if(start == m)
{
if(dp[start][j - ] - a[start][j - ] == dp[start - ][j])
minn = min(minn, start - );
if(dp[start][j - ] - a[start][j - ] == dp[start][j])
minn = min(minn, start);
if(dp[start][j - ] - a[start][j - ] == dp[][j])
minn = min(minn, );
start = minn;
continue;
}
else
{
if(dp[start][j - ] - a[start][j - ] == dp[start - ][j])
minn = min(minn, start - );
if(dp[start][j - ] - a[start][j - ] == dp[start][j])
minn = min(minn, start);
if(dp[start][j - ] - a[start][j - ] == dp[start + ][j])
minn = min(minn, start + );
start = minn;
continue;
}
}
printf("%d\n%d\n",start,ans);
}
return ;
}

UVA116Unidirectional TSP(DP+逆推)的更多相关文章

  1. 概率dp——逆推期望+循环迭代zoj3329

    首先要推出dp[i]的期望方程,会发现每一项都和dp[0]相关, 那我们将dp[i]设为和dp[0]有关的式子dp[i]=a[i]*dp[0]+b[i],然后再回代到原来的期望方程里 然后进行整理,可 ...

  2. hdu 3853 LOOPS (概率dp 逆推求期望)

    题目链接 LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Tota ...

  3. UVA 1025 A Spy in the Metro 【DAG上DP/逆推/三维标记数组+二维状态数组】

    Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After s ...

  4. UVA116-Unidirectional TSP(动态规划基础)

    Problem UVA116-Unidirectional TSP Accept: 7167  Submit: 56893Time Limit: 3000 mSec Problem Descripti ...

  5. HDU 1176-免费馅饼(DP_逆推)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. sgu 495. Kids and Prizes (简单概率dp 正推求期望)

    题目链接 495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: s ...

  7. HDU 5844 LCM Walk(数学逆推)

    http://acm.hdu.edu.cn/showproblem.php?pid=5584 题意: 现在有坐标(x,y),设它们的最小公倍数为k,接下来可以移动到(x+k,y)或者(x,y+k).现 ...

  8. hdu 5063 操作逆推+mul每次要*2%(modo - 1)

    http://acm.hdu.edu.cn/showproblem.php?pid=5063 只有50个询问,50个操作逆推回去即可,注意mul每次要*2%(modo - 1)因为是指数! #incl ...

  9. uva10537 dijkstra + 逆推

    21:49:45 2015-03-09 传送 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...

随机推荐

  1. 16Spring_AOP编程(AspectJ)_最终通知

  2. RDLC系列之二 子报表

    本文实现简单的子报表 一.效果图

  3. C语言 复杂的栈(链表栈)

    //复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...

  4. c#上利用NPlot实现动态曲线图需要的dll文件

    这儿暂时只提供我之间根据网上的方法编译出来的dll文件,大家如果需要直接在vs项目上导入就行了,然后在工具箱里就会自动添加一项,大家添加上去就知道了. 下载地址:http://pan.baidu.co ...

  5. win8安装mean.io详解

    最近,老大说要安装mean.io,然后……我的win8华丽丽的就上战场了……这期间真是安装得要生要死……最终也终于“不辱使命”成功安装上了…… 废话不多说,进入正题啦 前提当然是电脑有node.环境… ...

  6. [C/C++基础] C语言常用函数strlen的使用方法

    函数声明:extern unsigned int strlen(char *s); 所属函数库:<string.h> 功能:返回s所指的字符串的长度,其中字符串必须以’\0’结尾 参数:s ...

  7. ASP.NET MVC系列 框架搭建(一)之仓储层的搭建

    大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...

  8. cocos2d-x 3.0以上版本字体设置问题

    cocos2d-x中的万年大坑,字体总算是有比较好的结局办法了.之前都是CCLabelTTF,CCLabelBMFont,CCLabelAtlas什么的,我只想说一句:好难用!毕竟是做游戏,那么难看的 ...

  9. post数据

    http://cnodejs.org/topic/4f16442ccae1f4aa2700104d http://www.cnblogs.com/pingfan1990/p/4701355.html ...

  10. [USACO2003][poj2138]Travel Games(dp/最长路)

    http://poj.org/problem?id=2138 题意:给你一些单词和初始单词,在初始单词的任意位置你可以加任意一个字母,使得这个新单词在给的单词中有所出现,然后在这样不断迭代下去,让你求 ...