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记忆化搜索的思想来考虑是思路很清晰的,但是困难在如何求出字典序最小的路. 因为左边到右边的字典序最小就必须 ...
随机推荐
- Codeforce Round #220 Div2
这场气场太大,居然一个题不会! 所以没交! 赛后发现 A:陷阱多- -!不要超过上下界,可以上去再下来! B:不会做! C:自己想太多- -!
- 求树的重心(POJ1655)
题意:给出一颗n(n<=2000)个结点的树,删除其中的一个结点,会形成一棵树,或者多棵树,定义删除任意一个结点的平衡度为最大的那棵树的结点个数,问删除哪个结点后,可以让平衡度最小,即求树的重心 ...
- 算法训练 Torry的困惑(基本型)
http://lx.lanqiao.org/problem.page?gpid=T129 算法训练 Torry的困惑(基本型) 时间限制:1.0s 内存限制:512.0MB 问题描述 ...
- .NET: C#: 获取当前路径
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...
- js正则表达式进行格式校验
今天做了个js正则表达式的练习,利用正则表达式进行注册信息格式验证,注册信息界面如下: 格式要求: 1.学号项不能为空,必须为纯数字,不能与数据库中的重复,正则表达式/^\d+$/g: 2.姓名项不能 ...
- Spring 中的 Bean 配置
内容提要 •IOC & DI 概述 •配置 bean –配置形式:基于 XML 文件的方式:基于注解的方式 –Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & ...
- paper 25 :SVM支持向量机是什么意思?
转载来源:https://www.zhihu.com/question/21094489 作者:余洋链接:https://www.zhihu.com/question/21094489/answer/ ...
- BJFU 1009
描述 现在社会上的抽奖活动简直是太多了.前段时间中国联通就举办了一个很无聊的抽奖活动,规则是每人可以向中国联通的短信系统发送一个实数,系统每天会从这些数字中选择一个无重复(就是有且只有一个)且最小的数 ...
- linux下奇怪的“重名”文件
是这样的,文件创建是通过远程命令来进行的. 就是在表单中输入命令,然后使用php的system来执行. 表单使用的是多行文本输入框. 可能某次使用 类似touch这种命令创建文件的时候多按了一次回车, ...
- SQL2005中的事务与锁定(一) - 转载
----------------------------------------------------------------------- -- Author : HappyFlyStone -- ...