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& ...
随机推荐
- work_queue 函数调用栈
init_workqueues ---> create_worker --> kthread_create_on_node
- 【C#】【MySQL】C# 查询数据库语句@Row:=@Row+1
如何实现数据库查询产生虚拟的一列序号的功能: ) )AS r; 该语句可以实现产生虚拟的一列数据在MySQL中运行没有问题. 但是在C#里面调用去出现了错误"Parameter '@ROW' ...
- 微信公众平台开发之微信access_token如何有效长期保存
随着微信使用越来越广泛,微信公众平台开放了许多接口以提供更多个性化的服务,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数ac ...
- js window.open()实现打印,如何在关闭打印窗口时刷新父窗口
var childWin = window.open("your URL"); //获取子窗口句柄childWin.onunload = function(){ //onunloa ...
- 自定义progressBar的旋转圆圈
在手工打造下拉刷新功能 自带的progressBar太丑了 做个也不费事,一个简单的圆形 旋转动画加type是sweep的gradient渐变 <rotate //旋转动画xmlns:andro ...
- html:关于表单功能的学习
比如我在某jsp页面中写了如下表单: <form action="/MavenWeb/TestFormPost" method="get"> & ...
- LeetCode 334 Increasing Triplet
这个题是说看一个没有排序的数组里面有没有三个递增的子序列,也即: Return true if there exists i, j, k such that arr[i] < arr[j] &l ...
- SpringMVC重定向视图RedirectView小分析
目录 前言 RedirectView介绍 实例讲解 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnbl ...
- mvc Areas注册域常见问题一
添加Areas主要目的是区分一些不同的业务,避免不同的业务都在同一个Controllers下造成混乱,在MVC项目上右键->添加区域->我添加了HMbolie和PClient两个区域-&g ...
- 【MPI学习5】MPI并行程序设计模式:组通信MPI程序设计
相关章节:第13章组通信MPI程序设计. MPI组通信与点到点通信的一个重要区别就是:组通信需要特定组内所有成员参与,而点对点通信只涉及到发送方和接收方. 由于需要组内所有成员参与,因此也是一种比较复 ...