POJ 3311 【状态压缩DP】
题意:
给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);
}
}
POJ 3311 【状态压缩DP】的更多相关文章
- POJ 1185 状态压缩DP(转)
1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...
- POJ 1185 状态压缩DP 炮兵阵地
题目直达车: POJ 1185 炮兵阵地 分析: 列( <=10 )的数据比较小, 一般会想到状压DP. Ⅰ.如果一行10全个‘P’,满足题意的状态不超过60种(可手动枚举). Ⅱ.用DFS ...
- poj 2923(状态压缩dp)
题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数. 分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法: ...
- poj 2688 状态压缩dp解tsp
题意: 裸的tsp. 分析: 用bfs求出随意两点之间的距离后能够暴搜也能够用next_permutation水,但效率肯定不如状压dp.dp[s][u]表示从0出发訪问过s集合中的点.眼下在点u走过 ...
- Mondriaan's Dream(POJ 2411状态压缩dp)
题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放 ...
- poj 2411 状态压缩dp
思路:将每一行看做一个二进制位,那么所有的合法状态为相邻为1的个数一定要为偶数个.这样就可以先把所有的合法状态找到.由于没一层的合法状态都是一样的,那么可以用一个数组保存.由第i-1行到第i行的状态转 ...
- poj 3254 状态压缩DP
思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k]: 这个方程得 ...
- POJ 3254 状态压缩 DP
B - Corn Fields Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536KB ...
- poj 3311(状态压缩DP)
poj 3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...
- poj 3311 floyd+dfs或状态压缩dp 两种方法
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6436 Accepted: 3470 ...
随机推荐
- Oracle translate 函数的用法, 以及和replace的区别
translate 是用来替换字符的函数 语法: translate(char, from_str,to_str) 其中,char是待处理的字符串. from_str是按顺序排列若干个要被替换 ...
- 解决 nginx https反向代理http协议 302重定向localtion到http问题
location /rest { #proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remot ...
- sqlserver修改某列为行号
UPDATE t_users SET t_users.id=u.num1 FROM t_users INNER JOIN (SELECT row_number() over(order by id) ...
- eclipse中java文件报错:The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files
问题:The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class fi ...
- PO、VO、BO、DTO
J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋 ...
- MongoDB 启动mongo不带DB
> mongo --nodb > conn = new Mongo("localhost:27017"); > db = conn.getDB("tes ...
- [转].net 使用NPOI或MyXls把DataTable导出到Excel
本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...
- ab压测参数说明
ab是apache自带的压力测试工具,非常实用.ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也 ...
- chmod 权限777 是什么意思(Unix和Linux的各种操作系统下)
在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读.写.运行设定权限.例如我用ls -l命令列文件表时,得到如下输出:-rw-r--r-- 1 bu users 2254 ...
- 内存修改console
#include <stdio.h> #include <windows.h> #include <winuser.h> int main() { int cur_ ...