题目链接: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. Redis分布式

    昨天公司技术大牛做了一个Redis分布式的技术分享: Redis分布式资源: http://redis.io/topics/cluster-tutorialhttp://redis.io/topics ...

  2. Leetcode: Rotate Function

    Given an array of integers A and let n to be its length. Assume Bk to be an array obtained by rotati ...

  3. G面经prepare: Chucked Palindrome

    给定一个字符串,找出最多有多少个chunked palindrome, 正常的palindrome是abccba, chunked palindrome的定义是:比如volvo, 可以把vo划分在一起 ...

  4. 很赞的PHP字符串加密函数

    最近, 从discuz里面发现了一个很牛的加密解密函数. 此函数的厉害之处在于可以在指定时间内加密还原字符串,超时无法还原 这样我们就可以拿此函数来做很多用途了,比如:单点登录的token加密传输啦, ...

  5. 树形DP(01组合背包The Ghost Blows Light HDU4276)

    题意:有n个房间,之间用n-1条道路连接,每个房间都有一个定时炸弹,在T时间后会一起爆炸,第i个房间有pi价值的珠宝,经过每条道路都需要花费一定的时间,一个人从1房间开始 ,从n房间出去,保证再不炸死 ...

  6. [原创]java WEB学习笔记83:Hibernate学习之路---双向 1-n介绍,关键点解释,代码实现,set属性介绍(inverse,cascade ,order-by )

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. JS_01_入门学习

    01:编写js文件:JavaScript_01.js // JavaScript Document //1.利用JavaScript来输出文字 <script type="text/j ...

  8. Android测试AsyncTask下载图片

    package com.example.myact8_async; import org.apache.http.HttpEntity; import org.apache.http.HttpResp ...

  9. unable to connect to the virtual device Genymotion 神器启动问题

    截图: 解决方法:win7以上用户在桌面找到:网络--右键(属性)--更改适配器设置--VirtualBox Host-Only Network--属性--双击:Internet 协议版本4(TCP/ ...

  10. android 三种定位方式

    http://www.cnblogs.com/oudi/archive/2012/03/22/2411509.html 最近在看android关于定位的方式,查了很多资料,也做了相关实验,在手机上做了 ...