「CodeVS」 2800 送外卖

题意:原题在这

快递小哥从city 0出发去(n+1)*(n+1)城市矩阵中送快递,求来回最短时间

做法:

TSP问题,这里选用dp做法

Floyd初始化城市间的距离;

令dp[1<<i][i]=dis[0][i];  表示先走一格,好转移

dp[s][j]表示走了j个城市,状态为s时的最小时间

注意所有循环从0开始!从0开始!从0开始!调死人qwq

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define inf 0x3ffff
using namespace std;
int n;
int dis[20][20];
int dp[1<<20][20]; //1<<n即为pow(2,n)的位运算形式

int main()
{
    cin>>n;
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)
    {
        cin>>dis[i][j];
    }
    //初始化
    for(int k=0;k<=n;k++)
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)
    {
        dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    }
    int digit=(1<<(n+1))-1;
    for(int s=0;s<(1<<17);s++)
    for(int i=0;i<17;i++)
    {
        dp[s][i]=inf;
    }
    for(int i=1;i<=n+1;i++)
    {
        dp[1<<i][i]=dis[0][i];//先走一格,好转移
    }

    for(int s=0;s<=digit;s++)
    for(int i=0;i<=n;i++)
    {
        if((s|(1<<i))!=s) continue;
        for(int j=0;j<=n;j++)
        {
            //if(i==j) continue;
            dp[s|(1<<j)][j]=min(dp[s][i]+dis[i][j],dp[s|(1<<j)][j]);
        }
    }

    cout<<dp[digit][0]<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/LocaEtric/p/9614881.html

时间: 2024-10-01 02:29:34

「CodeVS」 2800 送外卖的相关文章

【CODEVS】2800 送外卖

[算法]最短路(floyd)&&状态压缩型动态规划(DP) [题解]dp的顺序应该是由含1的个数少的二进制到1的个数高的二进制(第一重循环) #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int inf=0x3f3f3f3f,maxn=18; int mp[maxn][maxn],f[maxn][(1<<maxn)],n; i

codevs 2800 送外卖 TSP问题

2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n 个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少.现在已知 任意两个城市的直接通路的时间. 输入描述 Input Description 第一行一个正整数n (1<=

2800 送外卖

2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少.现在已知任意两个城市的直接通路的时间. 输入描述 Input Description 第一行一个正整数n (1<

codevs 2800 送外卖

/* f[i][j] 表示走过的点构成i状态 且最后到达的点为j时的最优解 在那最后一个状态就是(1<<n+1)-1 每个点都到达 在由此回到0 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 100010//最少到 1<<16 using namespace std; int n,g[20][20],f[maxn][20],ans=0x3f3f3f3f;

CODEVS_2800 送外卖 状态压缩+动态规划

原题链接:http://codevs.cn/problem/2800/ 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少.现在已知任意两个城市的直接通路的时间. 输入描述 Input Description 第一行一个正整数n (1<=n<=15) 接下来是一个(n+1)

大数据和「数据挖掘」是何关系?---来自知乎

知乎用户,互联网 244 人赞同 在我读数据挖掘方向研究生的时候:如果要描述数据量非常大,我们用Massive Data(海量数据)如果要描述数据非常多样,我们用Heterogeneous Data(异构数据)如果要描述数据既多样,又量大,我们用Massive Heterogeneous Data(海量异构数据)--如果要申请基金忽悠一笔钱,我们用Big Data(大数据) 编辑于 2014-02-2817 条评论感谢 收藏没有帮助举报作者保留权利 刘知远,NLPer 4 人赞同 我觉得 大数据

codevs2800 送外卖

题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少.现在已知任意两个城市的直接通路的时间. 输入描述 Input Description 第一行一个正整数n (1<=n<=15) 接下来是一个(n+1)*(n+1)的矩阵,矩阵中的数均为不超过10000的正整数.矩阵的i行j

程序员「奇葩」说

一直以来「奇葩」这个词都是偏贬义的,直到去年有个综艺节目叫「奇葩说」挺热闹,这里的人不一定是奇葩,更多指达人的意思. 「奇葩说」里的达人都是能说会道的,我的主业是程序员,所以只能写写在我职业生涯中碰到的一些「奇葩」程序员. 你懂的,我这里的「奇葩」没有任何贬义的意思. 月在胸襟人在途 我刚入行时的第一位项目经理,70后.那年三十出头,在银行客户现场做项目经理,负责一个二十来人的客户现场团队. 虽然他的职位是项目经理,但实际那时他真是一名地道的资深程序员. 70 后的程序员大都是从写 C 开始的,

为什么说产品经理要有「傻瓜」的心态?

摘要 : 我最早听到类似的说法并不来自于张小龙,而是一本书.书的名字叫做<像外行一样思考>,作者是美国卡耐基·梅隆大学(CMU)的计算机科学和机器人研究所的金出武雄教授.金教授的学术固然在同行眼里高山仰止,行文也极为流畅.关于写作,他的观点是,无论写科普还是论文,都要像创作小说那样写出引人入胜的独特观点.这一点和 MacTalk 秉承的写作原则一脉相承. 微信之父张小龙曾经在「微信背后的产品观」里讲到:「产品经理要有傻瓜心态」.这里的傻瓜并不是真傻,而是一种外行心态.张小龙说,自己要经过5-1