poj 3311 Hie with the Pie (状压dp) (Tsp问题)
2024-08-31 10:14:27
这道题就是Tsp问题,稍微加了些改变
注意以下问题
(1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离
(2)在循环中集合可以用S表示更清晰一些
(3)第一维为状态,第二维为在哪个点,不要写混。
(4)在dp过程中0这个点是不用的,只用到1到n这个点
而实际上dp过程中用的是0到n-1,所以就枚举1到n,然后涉及到集合的地方就写i-1
其他地方如dp的第二维,距离这些都不变。
还有一个方法,是我一开始想的方法,就是在输入的时候就把0放到第n个点,其他下标-1
(4)这道题求最小值,一定要先初始化为最大值
方法一(涉及到集合的时候下标-1)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 15;
int dist[MAXN][MAXN], dp[1 << 11][MAXN], n;
int main()
{
while(~scanf("%d", &n) && n)
{
_for(i, 0, n)
_for(j, 0, n)
scanf("%d", &dist[i][j]);
_for(k, 0, n)
_for(i, 0, n)
_for(j, 0, n)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
memset(dp, 0x3f, sizeof(dp));
_for(i, 1, n) dp[1 << (i - 1)][i] = dist[0][i];
REP(S, 0, 1 << n)
_for(i, 1, n) if(S & (1 << (i - 1)))
_for(j, 1, n) if(S & (1 << (j - 1)))
dp[S][i] = min(dp[S][i], dp[S^(1<<(i-1))][j] + dist[j][i]);
int ans = 1e9;
_for(i, 1, n)
ans = min(ans, dp[(1 << n) - 1][i] + dist[i][0]);
printf("%d\n", ans);
}
return 0;
}
方法二(直接在输入的时候改变)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 15;
int dist[MAXN][MAXN], dp[1 << 11][MAXN], n;
int main()
{
while(~scanf("%d", &n) && n)
{
_for(i, 0, n)
_for(j, 0, n)
scanf("%d", &dist[(!i ? n : i - 1)][(!j ? n : j - 1)]);
_for(k, 0, n)
_for(i, 0, n)
_for(j, 0, n)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
memset(dp, 0x3f, sizeof(dp));
REP(i, 0, n) dp[1 << i][i] = dist[n][i];
REP(i, 0, 1 << n)
REP(j, 0, n) if(i & (1 << j))
REP(k, 0, n) if(i & (1 << k))
if(j != k)
dp[i][j] = min(dp[i][j], dp[i^(1<<j)][k] + dist[k][j]);
int ans = 1e9;
REP(i, 0, n)
ans = min(ans, dp[(1 << n) - 1][i] + dist[i][n]);
printf("%d\n", ans);
}
return 0;
}
最新文章
- Windows操作系统下远程连接MySQL数据库
- CodeForces 37E Trial for Chief
- SQL Developer 4.0 启动报错“unable to create an instance of the java virtual machine located at path”
- .NET下的并行开发
- 如何查询MySql日志
- (转)HashMap分析
- ios 缓存策略
- SQL SERVER中的逻辑读,预读和物理读
- mvc框架下,怎样用cookie实现下次自动登录
- 项目管理-SVN服务器的搭建
- winform 以不规则图形背景显示窗体
- 7年,OpenStack从入门到放弃|送书
- Windows和Linux的Jmeter分布式集群压力测试
- 用软件工程分析开源项目octave的移植
- 检索(retrieval &;&; search )-单目标-多目标跟踪-MTMC Tracking和 ReID
- Centos 添加用户和用户组
- Day5 类和对象
- rarcrack
- ubuntu 16.04 安装opencv 2.4.13
- 2015/9/2 Python基础(7):元组
热门文章
- grep的各种用法
- 使用maven创建springMVC时返回页面报错
- 提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数
- PHP学习总结(9)——PHP入门篇之WAMPServer服务控制面板介绍
- Windows-命令窗口-强制关机命令
- [HTML 5] Atomic Relevant Busy
- MySql 基础学习笔记 1——概述与基本数据类型: 整型: 1)TINYINT 2)SMALLINT 3) MEDIUMINT 4)INT 5)BIGINT 主要是大小的差别 图 浮点型:命令
- Swift String转Character数组
- 英语发音规则---K字母
- spark 随机森林算法案例实战