题目链接: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的更多相关文章

  1. uva 116 单向TSP

    这题的状态很明显. 转移方程就是 d(i,j)=min(d(i+1,j+1),d(i,j+1),d(i-1,j+1)) //注意边界 我用了一个next数组方便打印结果,但是一直编译错误,原来是不能用 ...

  2. UVa 116 单向TSP(多段图最短路)

    https://cn.vjudge.net/problem/UVA-116 题意:给出m行n列的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列,要求经过的整数之和最小. ...

  3. uva 116 Unidirectional TSP (DP)

    uva 116 Unidirectional TSP Background Problems that require minimum paths through some domain appear ...

  4. uva 116 Unidirectional TSP【号码塔+打印路径】

    主题: uva 116 Unidirectional TSP 意甲冠军:给定一个矩阵,当前格儿童值三个方向回格最小值和当前的和,就第一列的最小值并打印路径(同样则去字典序最小的). 分析:刚開始想错了 ...

  5. UVA - 116 Unidirectional TSP (单向TSP)(dp---多段图的最短路)

    题意:给一个m行n列(m<=10, n<=100)的整数矩阵,从第一列任何一个位置出发每次往右,右上或右下走一格,最终到达最后一列.要求经过的整数之和最小.第一行的上一行是最后一行,最后一 ...

  6. UVA 116 Unidirectional TSP(dp + 数塔问题)

     Unidirectional TSP  Background Problems that require minimum paths through some domain appear in ma ...

  7. UVa - 116 - Unidirectional TSP

    Background Problems that require minimum paths through some domain appear in many different areas of ...

  8. UVA 116 Unidirectional TSP(DP最短路字典序)

    Description    Unidirectional TSP  Background Problems that require minimum paths through some domai ...

  9. UVa 116: Undirectional TSP

    简单动态规划题.用取模实现第一行与最后一行连续,注意取字典序即可. 我的解题代码如下: #include <iostream> #include <cstdio> #inclu ...

  10. UVA 116 Unidirectional TSP 经典dp题

    题意:找最短路,知道三种行走方式,给出图,求出一条从左边到右边的最短路,且字典序最小. 用dp记忆化搜索的思想来考虑是思路很清晰的,但是困难在如何求出字典序最小的路. 因为左边到右边的字典序最小就必须 ...

随机推荐

  1. C#: XML Serializer

    这里主要讲如何将一个class序列化为一个string.如下一个class: public class OrderedItem { private string itemName; private s ...

  2. Extjs4.x完美treepanel checkbox无限级选中与取消

    注:当node选中, childNodes逐级全部选中. parentNode当子node全部选中时逐级自动选中,nodes未全部选中, parentNode逐级自动取消选中 在javascript中 ...

  3. codeforces 70D Professor's task(动态二维凸包)

    题目链接:http://codeforces.com/contest/70/problem/D Once a walrus professor Plato asked his programming ...

  4. mysql server安装及密码重置

    官网上能下载到的mysql安装分两种:msi和zip安装 msi安装比较简单,直接下一步. 主要说zip格式的安装: 1.解压. zip解压后的文件夹改名后(也可以不改名)放在喜欢的位置.例如我放在C ...

  5. 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:解压到 ...

  6. 在centos中编译putty时提示找不到gtk库的解决办法

    明明已经安过gtk了, 后来在csdn上发现了前人的解决办法 yum install libgnomeui-devel 现在编译出来的putty就可以有图形界面了

  7. PHP导出CSV文件

    经常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限.这里的方法是利用fputcsv写CS ...

  8. 累加两个php数组,键相同的累加,不同的合并

    1. $arr1=array('name'=>33,'type'=>1); $arr2=array('name'=>33,'price'=>200); $res=array() ...

  9. Jar mismatch! Fix your dependencies

    在开发Android项目的时候,有时需要引用多个项目作为library.在引用项目的时候,有时会出现“Jar mismatch! Fix your dependencies”错误. 这是因为两个项目的 ...

  10. OpenStack 新加计算节点后修改

    Contents [hide] 1 前提 2 iptables禁止snat= 3 vlan支持 4 Quota支持 5 修改物理资源设置. 6 添加collectd 7 重启服务 前提 我们使用fue ...