Uva 116,单向TSP
题目链接:https://uva.onlinejudge.org/external/1/116.pdf
和矩形嵌套,巴比伦塔差不多。
题意:
给出矩阵,这个矩阵是环形的,就是说第一行的上一行是最后一行,最后一行的下一行是第一行,要求从最左边一列走到最右边一列,路径上的和最小。多组解输出字典序最小的解。
分析:
DAG多段图,dp(i,j)从第i行,第j列出发的最优解,然后走一遍每一行的第一列。
这里的字典序最小,每次决策时的三个选择,每一行,重新排个序,这样就保证了字典序最小。
姜来是老的辣,写了好久不知道WA在哪里,快写炸了。然后还是参考了下刘汝佳的写法,确实比我写的好一点,借鉴一下。
#include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f int a[][];
int dp[][];
int path[][]; int main()
{
//freopen("in.txt","r",stdin);
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
{
scanf("%d",&a[i][j]);
}
} memset(dp,INF,sizeof(dp)); int ans = INF+;
for(int j=n-; j>=; j--)
{
for(int i=; i<m; i++)
{
if(j==n-) dp[i][j] = a[i][j];
else
{
int row[] = {i,i-,i+};
if(i==) row[] = m-;
if(i==m-) row[] = ;
sort(row,row+); for(int k=; k<; k++)
{
int v = dp[row[k]][j+] + a[i][j];
if(v<dp[i][j])
{
dp[i][j] = v;
path[i][j] = row[k];
}
} } }
} int flag;
for(int i=;i<m;i++) {
if(ans>dp[i][])
{
ans = dp[i][];
flag = i;
}
} printf("%d",flag+);
for(int j=;j<n;j++) {
printf(" %d",path[flag][j]+);
flag = path[flag][j];
}
puts("");
printf("%d\n",ans); } return ;
}
/*
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std; #define INF 0x3f3f3f3f int a[15][105];
int dp[15][105];
int path[15][105];
int m,n; int main()
{
//freopen("in.txt","r",stdin); while(scanf("%d%d",&m,&n)==2&&m) { for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
} for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++)
dp[i][j] = INF;
} memset(path,0,sizeof(path)); for(int i=n;i>=1;i--) {
for(int j=1;j<=m;j++) {
if(i==n) {
dp[j][i] = a[j][i];
path[j][i] = j;
}
else {
if(j==1) { int temp = INF;
int f; if(temp>dp[j][i+1]) {
temp = dp[j][i+1];
f = j;
}
if(temp>dp[j+1][i+1]) {
temp = dp[j+1][i+1];
f = j+1;
}
if(temp>dp[m][i+1]) {
temp = dp[m][i+1];
f = m;
} dp[j][i] = a[j][i] + temp;
path[j][i] = f; }
else if(j==m) { int temp = INF;
int f;
if(temp>dp[1][i+1]) {
temp = dp[1][i+1];
f = 1;
}
if(temp>dp[j-1][i+1]) {
temp = dp[j-1][i+1];
f = j-1;
}
if(temp>dp[j][i+1]) {
temp = dp[j][i+1];
f = j;
} dp[j][i] = a[j][i] + temp;
path[j][i] = f; }
else {
int temp = INF;
int f;
if(temp>dp[j-1][i+1])
{
temp = dp[j-1][i+1];
f = j-1;
}
if(temp>dp[j][i+1]) {
temp = dp[j][i+1];
f = j;
}
if(temp>dp[j+1][i+1]) {
temp = dp[j+1][i+1];
f = j+1;
} dp[j][i] = a[j][i]+temp;
path[j][i] = f;
} }
}
} int flag = 0;
int ans = INF+1;
for(int i=1;i<=m;i++) {
if(ans>dp[i][1])
{
flag = i;
ans = dp[i][1];
}
} printf("%d",flag); for(int i=2;i<=n;i++) {
printf(" %d",path[flag][i-1]);
flag = path[flag][i-1];
}
puts("");
printf("%d\n",ans); } return 0;
}
*/ #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f int a[][];
int dp[][];
int path[][]; int main()
{
freopen("in.txt","r",stdin);
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
{
scanf("%d",&a[i][j]);
}
} for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
dp[i][j] = INF;
} int ans = INF+;
for(int j=n-; j>=; j--)
{
for(int i=; i<m; i++)
{
if(j==n-) dp[i][j] = a[i][j];
else
{
int row[] = {i,i-,i+};
if(i==) row[] = m-;
if(i==m-) row[] = ;
sort(row,row+); for(int k=; k<; k++)
{
int v = dp[row[k]][j+] + a[i][j];
if(v<dp[i][j])
{
dp[i][j] = v;
path[i][j] = row[k];
}
} } }
} int flag;
for(int i=; i<m; i++)
{
if(ans>dp[i][])
{
ans = dp[i][];
flag = i;
}
} printf("%d",flag+);
for(int i = path[flag][], j = ; j < n; i = path[i][j], j++)
printf(" %d", i+);
puts("");
printf("%d\n",ans); } return ;
}
Uva 116,单向TSP的更多相关文章
- uva 116 单向TSP
这题的状态很明显. 转移方程就是 d(i,j)=min(d(i+1,j+1),d(i,j+1),d(i-1,j+1)) //注意边界 我用了一个next数组方便打印结果,但是一直编译错误,原来是不能用 ...
- UVa 116 单向TSP(多段图最短路)
https://cn.vjudge.net/problem/UVA-116 题意:给出m行n列的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列,要求经过的整数之和最小. ...
- uva 116 Unidirectional TSP (DP)
uva 116 Unidirectional TSP Background Problems that require minimum paths through some domain appear ...
- uva 116 Unidirectional TSP【号码塔+打印路径】
主题: uva 116 Unidirectional TSP 意甲冠军:给定一个矩阵,当前格儿童值三个方向回格最小值和当前的和,就第一列的最小值并打印路径(同样则去字典序最小的). 分析:刚開始想错了 ...
- UVA - 116 Unidirectional TSP (单向TSP)(dp---多段图的最短路)
题意:给一个m行n列(m<=10, n<=100)的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列.要求经过的整数之和最小.第一行的上一行是最后一行,最后一 ...
- UVA 116 Unidirectional TSP(dp + 数塔问题)
Unidirectional TSP Background Problems that require minimum paths through some domain appear in ma ...
- UVa - 116 - Unidirectional TSP
Background Problems that require minimum paths through some domain appear in many different areas of ...
- UVA 116 Unidirectional TSP(DP最短路字典序)
Description Unidirectional TSP Background Problems that require minimum paths through some domai ...
- UVa 116: Undirectional TSP
简单动态规划题.用取模实现第一行与最后一行连续,注意取字典序即可. 我的解题代码如下: #include <iostream> #include <cstdio> #inclu ...
- UVA 116 Unidirectional TSP 经典dp题
题意:找最短路,知道三种行走方式,给出图,求出一条从左边到右边的最短路,且字典序最小. 用dp记忆化搜索的思想来考虑是思路很清晰的,但是困难在如何求出字典序最小的路. 因为左边到右边的字典序最小就必须 ...
随机推荐
- C#: XML Serializer
这里主要讲如何将一个class序列化为一个string.如下一个class: public class OrderedItem { private string itemName; private s ...
- Extjs4.x完美treepanel checkbox无限级选中与取消
注:当node选中, childNodes逐级全部选中. parentNode当子node全部选中时逐级自动选中,nodes未全部选中, parentNode逐级自动取消选中 在javascript中 ...
- codeforces 70D Professor's task(动态二维凸包)
题目链接:http://codeforces.com/contest/70/problem/D Once a walrus professor Plato asked his programming ...
- mysql server安装及密码重置
官网上能下载到的mysql安装分两种:msi和zip安装 msi安装比较简单,直接下一步. 主要说zip格式的安装: 1.解压. zip解压后的文件夹改名后(也可以不改名)放在喜欢的位置.例如我放在C ...
- Linux centOS7 下安装mysql5.7.10
1:下载二进制安装包 http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz 2:解压到 ...
- 在centos中编译putty时提示找不到gtk库的解决办法
明明已经安过gtk了, 后来在csdn上发现了前人的解决办法 yum install libgnomeui-devel 现在编译出来的putty就可以有图形界面了
- PHP导出CSV文件
经常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限.这里的方法是利用fputcsv写CS ...
- 累加两个php数组,键相同的累加,不同的合并
1. $arr1=array('name'=>33,'type'=>1); $arr2=array('name'=>33,'price'=>200); $res=array() ...
- Jar mismatch! Fix your dependencies
在开发Android项目的时候,有时需要引用多个项目作为library.在引用项目的时候,有时会出现“Jar mismatch! Fix your dependencies”错误. 这是因为两个项目的 ...
- OpenStack 新加计算节点后修改
Contents [hide] 1 前提 2 iptables禁止snat= 3 vlan支持 4 Quota支持 5 修改物理资源设置. 6 添加collectd 7 重启服务 前提 我们使用fue ...