题面


著名的TSP问题,NPC问题

对于数据大的情况,我们可以使用一系列近似算法进行寻找解。

对于数据规模小的情况,我们可以直接暴力dp

一开始写了一个dfs,然后就被n=20的数据卡爆了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using std::min;
const int maxn=22;
int f[1<<maxn][maxn];
int M[maxn][maxn];
int n;
int dfs(int base,int now)
{
if(base&1==0) return f[base][now]=0x7fffffff;
if(f[base][now]) return f[base][now];
int ans=0x7ffffff;
for(int i=0;i<n;i++)
if(base&(1<<i)&&i+1!=now)
ans=min(ans,dfs(base^(1<<(now-1)),i+1)+M[i+1][now]);
return f[base][now]=ans;
}
int main()
{
scanf("%d",&n);
f[1][1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&M[i][j]);
if(i==j) M[i][j]=0x7ffffff;
}
for(int i=1;i<=n;i++)
{
M[i][n+1]=M[i][1];
M[n+1][i]=M[1][i];
}
n++;
dfs((1<<n)-1,n);
printf("%d",f[(1<<n)-1][n]-1);
}

然后就回去补了一发递推,还是递推常数小呀。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using std::min;
const int maxn=20,inf=0x7ffffff;
int f[1<<maxn][maxn];
int M[maxn][maxn];
int n;
int main()
{
memset(f,127,sizeof(f));
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&M[i][j]);
for(int i=0;i<n;i++) M[i][i]=inf;
f[1][0]=0;
for(int i=1;i<(1<<n);i++)
for(int j=0;j<n;j++)
if(i&(1<<j))
for(int k=0;k<n;k++)
if((i&(1<<k))==0)
f[i^(1<<k)][k]=min(f[i^(1<<k)][k],f[i][j]+M[j][k]);
int ans=inf;
for(int i=1;i<n;i++)
ans=min(ans,f[(1<<n)-1][i]+M[i][0]);
printf("%d",ans);
}

感觉dp在noip会是我的大难♂题

P1171 售货员的难题 暴力dp的更多相关文章

  1. P1171 售货员的难题

    P1171 售货员的难题 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0< ...

  2. 洛谷P1171 售货员的难题

    P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...

  3. 洛谷 P1171 售货员的难题

    P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...

  4. 洛谷P1171 售货员的难题【状压DP】

    题目描述 某乡有n个村庄(1 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入样例: 3 0 2 1 1 0 2 2 1 0 输出样例 3 说明 输入解释 3 {村庄 ...

  5. 2018.07.18 洛谷P1171 售货员的难题(状压dp)

    传送门 感觉是一道经典的状压dp,随便写了一发卡了卡常数开了个O(2)" role="presentation" style="position: relati ...

  6. 洛谷 P1171 售货员的难题 【状压dp】

    题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...

  7. P1171 售货员的难题--搜索(剪枝)

    题目背景 数据有更改 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0<s ...

  8. 【题解】P1171 售货员的难题

    Tags 搜索,状压​. 裸的旅行商问题 #include <stdio.h> #include <string.h> #define re register #define ...

  9. codevs2596 售货员的难题(状压dp)

    2596 售货员的难题  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond     题目描述 Description 某乡有n个村庄(1<n<=15 ...

随机推荐

  1. Zookeeper概念学习系列之zookeeper是什么?

    1. Zookeeper是Hadoop的分布式协调服务. 2. 分布式应用程序可以基于它,来实现同步服务,配置维护和命名服务等. 3. zookeeper可以保证数据在zookeeper集群之间的数据 ...

  2. centos7 中文乱码问题解决方法

    1.查看是否安装中文包 可以使用下面的命名查看系统是否安装了中文安装包. locale -a |grep "zh_CN" 没有输出,说明没有安装,输入下面的命令安装: yum gr ...

  3. Tor网络介绍

    Tor网络介绍 1.Tor的全称是“The Onion Router”,“An anonymous Internet communicaton system:通过Tor访问一个地址时,所经过的节点在T ...

  4. C#(Winform)的Show()和ShowDialog()方法

    1. 显示窗口的两种方式: Winform中的Form,在显示窗口时,可以使用Show()和ShowDialog()两种方式 2. 非模态窗口方式(可以跟其他界面自由切换,而且不阻塞代码) Show( ...

  5. Java入门系列-08-选择结构

    这篇文章为你搞懂2个问题 if-else选择结构的使用? switch 的使用? 前面我们学习的代码都是直上直下的执行,还不会"拐弯",这篇文章带大家来看一下会"拐弯&q ...

  6. HDU 5222 ——Exploration——————【并查集+拓扑排序判有向环】

    Exploration Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  7. springboot--数据库操作

    1.注意: 使用get,post提交时,使用form-data; 使用put提交方式,使用x-www-form-url-encoded,这是http的一种格式;

  8. oracle学习篇十一:视图

    视图是存储的查询定义. 1. 创建视图的语法如下: Create [OR REPLACE] [FORCE | NOFORCE] VIEW view_name[(alias,alias,...)] AS ...

  9. 1094 FBI树

    1094 FBI树 2004年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver       题目描述 Description 我们可以把由“ ...

  10. HTML 提高页面加载速度的方法

    (1)减少 HTTP 的请求.(合并资源文件 和 使用图片精灵 : (2)把CSS  放头部,把 JavaScript 放到 body 标签尾部: (3)定义图片的宽和高: (4)定义字符集: (5) ...