UVA116Unidirectional TSP(DP+逆推)
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+逆推)的更多相关文章
- 概率dp——逆推期望+循环迭代zoj3329
首先要推出dp[i]的期望方程,会发现每一项都和dp[0]相关, 那我们将dp[i]设为和dp[0]有关的式子dp[i]=a[i]*dp[0]+b[i],然后再回代到原来的期望方程里 然后进行整理,可 ...
- hdu 3853 LOOPS (概率dp 逆推求期望)
题目链接 LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Tota ...
- 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 ...
- UVA116-Unidirectional TSP(动态规划基础)
Problem UVA116-Unidirectional TSP Accept: 7167 Submit: 56893Time Limit: 3000 mSec Problem Descripti ...
- HDU 1176-免费馅饼(DP_逆推)
免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- sgu 495. Kids and Prizes (简单概率dp 正推求期望)
题目链接 495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: s ...
- HDU 5844 LCM Walk(数学逆推)
http://acm.hdu.edu.cn/showproblem.php?pid=5584 题意: 现在有坐标(x,y),设它们的最小公倍数为k,接下来可以移动到(x+k,y)或者(x,y+k).现 ...
- hdu 5063 操作逆推+mul每次要*2%(modo - 1)
http://acm.hdu.edu.cn/showproblem.php?pid=5063 只有50个询问,50个操作逆推回去即可,注意mul每次要*2%(modo - 1)因为是指数! #incl ...
- uva10537 dijkstra + 逆推
21:49:45 2015-03-09 传送 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...
随机推荐
- ios--Attributes和ParagraphStyle介绍
NSMutableParagraphStyle的部分属性: typedef NS_ENUM(NSInteger, NSLineBreakMode) {/* What to do with long l ...
- 16SpringMvc_在业务控制方法中写入User,Admin多个模型收集参数——引出问题
上面文章时普通的业务那个方法中收集一个实体类,这篇文章想收集两个实体类. 文本要做的是:在person.jsp页面上,有两个表单.分别是普通用户和管理员用户的表单(普通用户的表单和管理员用户的表单里面 ...
- ubuntu中启用ssh服务
ssh程序分为有客户端程序openssh-client和服务端程序openssh-server.如果需要ssh登陆到别的电脑,需要安装openssh-client,该程序ubuntu是默认安装的.而如 ...
- GridView自定义分页
CSS样式 首先把CSS样式代码粘贴过来: .gv { border: 1px solid #D7D7D7; font-size:12px; text-align:center; } .gvHeade ...
- JS 之性能优化(1)
了解JS性能优化是学习前端必备的一项技能.下面就简单的列出几点: 1.注意作用域,避免全局查找. 访问全局变量比访问局部变量慢,是因为需要遍历作用域链,查找作用域链需要额外的时间.所以在一个函数中,将 ...
- JS案例之1——pager 分页
学习JS大半年之久,第一次自己尝试写一些小插件,写法参考网上某位牛人写代码的思路. 此处代码写的是静态分页.如果需动态分页,还可以修改下.第一次写,还有很多地方可以优化.希望各位大牛踊跃拍砖. 预览图 ...
- listview向下滑动过程中背景色变成黑色和一些奇怪问题
ListView是一个经常要用到的android控件,现总结遇到过的一些美化的小细节. 1.listview在拖动的时候背景图片消失变成黑色背景,等到拖动完毕我们自己的背景图片才显示出来 这个问题是我 ...
- LeetCode-Count Univalue Subtrees
Given a binary tree, count the number of uni-value subtrees. A Uni-value subtree means all nodes of ...
- wen7安装oracle 11g出现"未找到文件 E:\development_tools\database\oracle\install_d\dbhome\owb\external\oc4j_applications\applications\WFMLRSVCApp.ear"
从oracle官网上下载了window7 64位的oracle安装包win64_11gR2_database_1of2,安装后出现了错误: 解决方法:继续下载oracle官网上的文件2:win64_1 ...
- 20145208 《Java程序设计》第4周学习总结
20145208 <Java程序设计>第4周学习总结 教材学习内容总结 继承 在学习指导中我了解到继承是符合DRY原则的,DRY(Don't repeat yourself),字面意思来看 ...