POJ 3311 【状态压缩DP】
2024-08-26 18:20:33
题意:
给n个点,给出矩阵代表i到j单向边的距离。
要求,不介意访问每个点的次数,要求访问完每个点,使得路程总和最小。
思路:
由于不介意访问每个点的次数,所以可以先进行FLOYD求出任意两个点之间的最短路,然后就是DP。
同样的,1代表有访问过,0代表没访问过。
dp[s][j]代表访问状态为s的情况下最终到达点j的最优值。
枚举状态s中每一个可以到达的点,从所有可能的点中枚举对其进行更新。
关于状态压缩的细节方面,注意从左边数第i位是从0开始数的,所以第i位代表第i+1个点。
然后状态的总数2^(n)-1.
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
//dp[s][i]代表从s状态到达城市i的最佳策略
const int inf=0x3f3f3f3f;
int pho[][];
int dp[<<][];
int main()
{
int n;
scanf("%d",&n);
while(n)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&pho[i][j]);
}
}
for(int k=;k<=n;k++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
pho[i][j]=min(pho[i][k]+pho[k][j],pho[i][j]);
}
}
}
for(int s=;s<=(<<n)-;s++)
{
for(int i=;i<=n;i++)
{
if(s&(<<(i-)))
{
if(s==(<<(i-)))
{
dp[s][i]=pho[][i];
}
else
{
dp[s][i]=inf;
for(int j=;j<=n;j++)
{
if((s&(<<(j-)))&&i!=j)
{
dp[s][i]=min(dp[s][i],dp[s^(<<(i-))][j]+pho[j][i]);
}
}
}
}
}
}
int ans=inf;
for(int i=;i<=n;i++)
{
ans=min(ans,dp[(<<n)-][i]+pho[i][]);
}
printf("%d\n",ans);
scanf("%d",&n);
}
}
最新文章
- Hive官方手册翻译(Getting Started)
- contiki-进程
- Bootstrap 图标菜单按钮组件
- Namespaces(命名空间)
- mysql索引需要了解的几个注意
- oracle模糊查询效率可这样提高
- make执行过程
- 分享一款好用的PHP下ID混淆插件
- Jenkins使用-windows机器上的文件上传到linux
- unix域数据报回射程序(不完整)
- MySQL 笔记整理(3) --事务隔离,为什么你改了我还看不见?
- Chrome_查看 webSocket 连接信息
- 【转载】JsonLayout log4j2 json格式输出日志
- 【转】CentOS系统操作下安装相关各种软件
- python3爬虫——下载unsplash美图到本地
- 【个人阅读作业】软件工程M1/M2总结
- selenium去掉下载弹窗
- android api doc 一
- Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?
- Jenkins + GitLab 通过 Webhook 自动触发构建爬坑记录
热门文章
- 百度ue富文本编辑器setContent方法报错初始化加载内容失败解决办法
- android 实现拍照的2种方法
- ClassNotFoundException异常的解决方法
- yii 主从数据库分离-转载http://www.yiichina.com/doc/guide/2.0/db-dao
- 如何在ExtJS 6中使用Fashion美化应用程序
- Linux下编译java并生成jar包
- java学习笔记(三)字符串
- 在html中添加缩放meta
- windows7修改双系统启动项名称、先后顺序、等待时间
- JQuery validate 在IE兼容模式下出现 js错误(成员找不到)的修正: