关闭

[SPOJ PUTNIK]区间DP

标签: 区间dp
447人阅读 评论(0) 收藏 举报
分类:

[SPOJ PUTNIK]区间DP

知识点:dynamic programing uncommon TSP

1. 题目链接

[SPOJ PUTNIK]

2. 题意描述

旅行商问题TSP( Travelling Salesman Problem)概都清楚,经典的NP难问题之一。这个题目是一个变式的TSP问题。
经典的TSP问题是指:城市与城市之间有边权,求经过所有城市有且仅有一次,最小边权之和。
这个题目增加了一个约束条件:对于标号为K的城市,所有标号小于K的城市,要么在K之前被访问,要么都在K之后被访问。
城市数目2n1500, 从ij的边权cost[i][j][0,1000].

3. 解题思路

题目关键之所在,在于分析这个题目的特殊性。对于标号为K的城市,所有标号小于K的城市,要么在K之前被访问,要么都在K之后被访问。对于整个访问序列,可以这么理解,先放好标号为1的城市,接下来放编号为k+1的城市,它一定是只能放在当前序列的最左端或者最右端,整个序列可以看成从1开始向两端拓展【也可以像其中一端拓展】。
然后,用dp[i][j]表示起点为i终点为j的最小访问边权之和。从2n开始枚举顶点。有如下转移方程:

dp[u][i]=min{dp[u1][i]+cost[u][u1]}dp[i][u]=min{dp[i][u1]+cost[u][u1]}}i[1,u1]dp[u][u1]=min{dp[i][u1]+cost[u][i]}dp[u1][u]=min{dp[u1][i]+cost[i][u]}}i[1,u1]

4. 实现代码

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

typedef long long LL;

const int MAXN = 1500 + 5;
const int INF = 0x3f3f3f3f;

int n, cost[MAXN][MAXN];
int dp[MAXN][MAXN];

int main() {
#ifdef ___LOCAL_WONZY___
    freopen("input.txt", "r", stdin);
#endif // ___LOCAL_WONZY___
    while(~scanf("%d", &n)) {
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= n; ++j) {
                scanf("%d", &cost[i][j]);
                dp[i][j] = INF;
            }
        }
        dp[1][1] = dp[1][1] = 0;
        dp[1][2] = dp[2][1] = cost[1][2];
        for(int u = 3; u <= n; ++u) {
            for(int i = 1; i < u - 1; i++) {
                dp[u][u - 1] = min(dp[u][u - 1], dp[i][u - 1] + cost[u][i]);
                dp[u - 1][u] = min(dp[u - 1][u], dp[u - 1][i] + cost[i][u]);
                dp[u][i] = min(dp[u][i], dp[u - 1][i] + cost[u][u - 1]);
                dp[i][u] = min(dp[i][u], dp[i][u - 1] + cost[u - 1][u]);
            }
        }
        int ans = INF;
        for(int i = 1; i < n; i++) {
            ans = min(ans, dp[i][n]);
            ans = min(ans, dp[n][i]);
        }
        printf("%d\n", ans);
    }
    return 0;
}
1
0
查看评论

SPOJ - PUTNIK 区间dp

PUTNIK - PutnikChances are that you have probably already heard of the travelling salesman problem. If you have, then you are aware that it is an NP-h...
  • enamor_AC
  • enamor_AC
  • 2017-02-23 17:51
  • 115

SPOJ 17128 PUTNIK - Putnik(dp)

Description n个城市,第i个城市到第j个城市距离为a[i][j],先要指定一个旅游计划把这n个城市每个都旅游一遍,限制是如果要去第k个城市,那么所有编号小于k的城市要么已经旅游完了,要么都还没去,问路线总距离最小值 Input 第一行一整数n表示城市数量,之后一个n*n对称矩阵表示...
  • V5ZSQ
  • V5ZSQ
  • 2017-04-10 16:38
  • 105

SPOJ PUTNIK dp

PUTNIK - Putnik Chances are that you have probably already heard of the travelling salesman problem. If you have, then you are aware that it i...
  • black_miracle
  • black_miracle
  • 2017-02-19 16:38
  • 80

区间DP的主要思路

区间动态规划
  • xuanandting
  • xuanandting
  • 2015-07-31 16:08
  • 3902

区间DP 入门经典三道题

NYOJ 737:http://acm.nyist.net/JudgeOnline/problem.php?pid=737 代码:#include <cstdio> #include <iostream> #include <cstring> #define s...
  • SolarDomo
  • SolarDomo
  • 2016-08-15 14:17
  • 510

动态规划学习系列——区间DP(一)

学习一个算法,还是从题目开始比较好,我们就从一道经典例题开始: wikioi 1048 石子归并 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得...
  • fuyukai
  • fuyukai
  • 2015-02-13 17:13
  • 899

SPOJ GCJ1C09C (区间dp)

对监狱区间dp,也很好理解,不再赘述。#include #include #include #include #include #include using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 100...
  • ECNU_LZJ
  • ECNU_LZJ
  • 2016-11-29 22:01
  • 160

SPOJ - PUTNIK(想法+dp,好题)

PUTNIK - Putnik no tags  Chances are that you have probably already heard of the travelling salesman problem. If you have, then you are ...
  • fouzhe
  • fouzhe
  • 2017-01-25 18:59
  • 115

区间DP入门之 石子归并问题

题目描述:有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。 输入 有多组测试数据,输入到文件结束。 每组测试数据第一行有一个整数n,表示有n堆石子...
  • wuxuanyi27
  • wuxuanyi27
  • 2016-04-21 21:40
  • 988

区间dp模型(石子归并,括号匹配,整数划分)

区间dp顾名思义就是在一个区间上进行的一系列动态规划。对一些经典的区间dp总结在这里。 1) 石子归并问题 题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 描述: 有N堆石子排成一排,每堆石子有一定的数量...
  • y990041769
  • y990041769
  • 2014-04-20 21:51
  • 16541
    个人资料
    • 访问:307974次
    • 积分:5873
    • 等级:
    • 排名:第5194名
    • 原创:273篇
    • 转载:8篇
    • 译文:0篇
    • 评论:45条
    友情链接
    最新评论