UVA116 Unidirectional TSP 单向TSP

分阶段的DAG,注意字典序的处理和路径的保存。

定义状态d[i][j]为从i,j 出发到最后一列的最小花费,转移的时候只有三种,向上,向下,或平移。

#include<bits/stdc++.h>
using namespace std;

const int maxm = 11;
const int maxn = 101;

int G[maxm][maxn];
const int INF = 1e9;
int d[maxm][maxn];
int path[maxn][maxn];

int main()
{
    //freopen("in.txt","r",stdin);
    int m,n;
    while(~scanf("%d%d",&m,&n)){
        for(int i = 0; i < m; i++)
        for(int j = 0; j < n ;j++){
            scanf("%d",G[i]+j);
        }
        int ans = INF,head = 0;
        for(int i = 0; i < m; i++) d[i][n-1] = G[i][n-1];
        if(n == 1){
            for(int i = 0; i < m; i++){
                if(d[i][0]<ans) { ans = d[i][0]; head = i; }
            }
        }else {
            for(int j = n-2; j >= 0; j--){
                for(int i = 0; i < m; i++){
                    int nxt[] = {i,i+1,i-1};
                    if(i == 0) nxt[2] = m-1;
                    if(i == m-1) nxt[1] = 0;
                    sort(nxt,nxt+3);
                    d[i][j] = d[nxt[0]][j+1];
                    path[i][j] = nxt[0];
                    for(int k = 1; k < 3; k++){
                        int t = d[nxt[k]][j+1];
                        if(t < d[i][j]){
                            d[i][j] = t; path[i][j] = nxt[k];
                        }
                    }
                    d[i][j] += G[i][j];
                    if(j == 0 && d[i][j] < ans) { ans = d[i][j]; head = i; }
                }
            }
        }

        printf("%d",head+1);
        for(int i = path[head][0],j = 1; j < n; i = path[i][j], j++){
            printf(" %d",i+1);
        }
        printf("\n%d\n",ans);
    }
    return 0;
}
时间: 2024-08-29 20:58:54

UVA116 Unidirectional TSP 单向TSP的相关文章

uva 116 Unidirectional TSP 单向TSP 问题,经典dP(路径输出注意规划方向)

Unidirectional TSP Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Practice UVA 116 Appoint description: Description Download as PDF Background Problems that require minimum paths through some domain appear in many differ

uva116 - Unidirectional TSP(记忆化搜索)

题目:uva116 - Unidirectional TSP(记忆化搜索) 题目大意:给出一个数组,然后可以从第一列任意一行(i, 0)开始走,只能走三个位置(i + 1, 1) (i, 1), (i - 1, 0) 并且这里默认第一行和最后一行是相连着的,就是当i+ 1或着i - 1超出边界那么就到另一头的边界.最后输出字典序最小的路径. 解题思路:记忆化搜索.dp[x][y] =Min( dp[x + dir[i][0]][y + dir[i][0]] + mat[x][y]). 代码: #

【UVA116】 单向TSP Unidirectional TSP [动态规划]

一遍dp 要注意转移时它行号注意判断 因为它行是一个环 然后就是UVa一如既往令人窒息的输入输出 主要按的刘汝佳的思路 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 #include<cmath> 6 #include<stack> 7 #include<algorithm> 8 using namespace

uva116 Unidirectional TSP

#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS(a) memset(a,0,sizeof(a)) #define MS1(a) memset(a,-1,sizeof(dp)) using namespace std; typedef long long ll; const int maxn=1100; const int INF=1<<29; int n,m; int a[

Uva 116,单向TSP

题目链接:https://uva.onlinejudge.org/external/1/116.pdf 和矩形嵌套,巴比伦塔差不多. 题意: 给出矩阵,这个矩阵是环形的,就是说第一行的上一行是最后一行,最后一行的下一行是第一行,要求从最左边一列走到最右边一列,路径上的和最小.多组解输出字典序最小的解. 分析: DAG多段图,dp(i,j)从第i行,第j列出发的最优解,然后走一遍每一行的第一列. 这里的字典序最小,每次决策时的三个选择,每一行,重新排个序,这样就保证了字典序最小. 姜来是老的辣,写

uva 116 Unidirectional TSP dp + 打印路径

// uva116 Unidirectional TSP // 这题是在紫书(page 270)上看到的,个人理解就是数塔的升级版 // dp[i][j]表示从(i,j)出发到终点所达到的最大价值 // 所以很明显j是逆序的 // 状态转移方程为 // dp[i][j] = min(dp[i][j],dp[row[k]][j+1]+mp[i][j]) // rows[k]表示三行中的一行i,i-1,i+1,特判一下,排个序 // (因为多解时输出字典序最小的值) // 这题唯一比较难的地方就是打

遗传算法解决TSP问题

1实验环境 实验环境:CPU [email protected],内存6G,windows7 64位操作系统 实现语言:java (JDK1.8) 实验数据:TSPLIB,TSP采样实例库中的att48数据源 数据地址:http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp/att48.tsp.gz TSPLIB是一个从各种来源和各种类型中产生的TSP及其相关问题的采样实例库,这里选取TSP采样实例库中的att48数据源,最优值为106

基于贪心算法求解TSP问题(JAVA)

前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值. TSP问题

TSP 遗传算法

GA——遗传算法 同模拟退火算法一样,都是现代优化算法之一.模拟退火是在一定接受程度的情况下仍然接受一个比较差的解. 遗传算法,是真真正正的和大自然的遗传进化有着非常紧密的联系的,当然遗传进化的只是在生物学中已经讲过了,8个字,物竞天择,适者生存. 简介 <物种起源>,有兴趣可以看看达尔文的著作. 物竞天择,适者生存,这两句话,也可以说是对遗传算法过程的伪代码描述了,物竞天择,就是我们的目标函数,只有越满足我们的目标函数的个体才会留下来,适者生存,就是我们在算法的过程中要淘汰一些个体. 基因编