POJ 2288 Islands and Bridges(状压dp)
http://poj.org/problem?id=2288
题意:
有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和:
第1部分,将路径中每个岛屿的权值累加起来;第2部分,对路径中的每条边(Ci,Ci+1),将成绩Vi×Vi+1累加起来;第3部分,当路径中连续的3个岛屿Ci、Ci+1和Ci+2形成一个三角形,即在岛屿Ci和Ci+2之间有一座桥,则把乘积Vi×Vi+1×Vi+2累加起来。
寻找权值最大的哈密顿路径和其路径数。
思路:
用d【status】【i】【j】表示当前状态为status,并且最后两个顶点分别为 i 和 j 时的最大权值,同理,ways【status】【i】【j】表示此时对应的路径的数量。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 #include<set> 12 using namespace std; 13 typedef long long ll; 14 typedef pair<int,int> pll; 15 const int INF = 0x3f3f3f3f; 16 const int maxn = 1000 + 5; 17 18 int n, m; 19 20 int val[13]; 21 int g[13][13]; 22 ll d[1<<13][13][13]; 23 ll ways[1<<13][13][13]; 24 25 int main() 26 { 27 //freopen("in.txt","r",stdin); 28 int T; 29 scanf("%d",&T); 30 while(T--) 31 { 32 memset(g,0,sizeof(g)); 33 memset(d,-1,sizeof(d)); 34 memset(ways,0,sizeof(ways)); 35 36 scanf("%d%d",&n,&m); 37 for(int i=0;i<n;i++) scanf("%d",&val[i]); 38 for(int i=0;i<m;i++) 39 { 40 int u, v; 41 scanf("%d%d",&u, &v); 42 u--; v--; 43 g[u][v]=g[v][u]=1; 44 //初始化 45 d[(1<<u)|(1<<v)][u][v]=d[(1<<u)|(1<<v)][v][u]=val[u]+val[v]+val[u]*val[v]; 46 ways[(1<<u)|(1<<v)][u][v]=ways[(1<<u)|(1<<v)][v][u]=1; 47 } 48 49 ll maxvalue=-1; 50 ll maxways=0; 51 52 if(n==1) {maxvalue=val[0];maxways=1;} //如果只有一个顶点,则特判 53 54 if(n!=1) 55 for(int s=0;s<(1<<n);s++) 56 { 57 for(int i=0;i<n;i++) 58 { 59 if(s&(1<<i)) 60 for(int j=0;j<n;j++) 61 { 62 if((i!=j) && (s&(1<<j)) &&d[s][i][j]>-1) 63 { 64 for(int k=0;k<n;k++) //枚举新加入的顶点 65 { 66 if(!(s&(1<<k)) && g[j][k]) 67 { 68 int nextstatus=s|(1<<k); 69 ll tmp = d[s][i][j]+val[k]+val[j]*val[k]; 70 if(g[i][k]) //如果Ci和Ci+2之间存在桥 71 tmp+=val[i]*val[j]*val[k]; 72 73 if(d[nextstatus][j][k]==tmp) 74 { 75 ways[nextstatus][j][k]+=ways[s][i][j]; 76 } 77 else if(d[nextstatus][j][k]<tmp) 78 { 79 d[nextstatus][j][k]=tmp; 80 ways[nextstatus][j][k]=ways[s][i][j]; 81 } 82 } 83 } 84 } 85 } 86 } 87 } 88 89 int s=(1<<n)-1; 90 if(n!=1) 91 for(int i=0;i<n;i++) 92 { 93 for(int j=0;j<n;j++) 94 { 95 if(g[i][j]==0) continue; 96 if(d[s][i][j]>maxvalue) 97 { 98 maxvalue=d[s][i][j]; 99 maxways=ways[s][i][j]; 100 } 101 else if(d[s][i][j]==maxvalue) 102 maxways+=ways[s][i][j]; 103 } 104 } 105 if(n!=1) maxways/=2; //因为正向和逆向是一样的,所以这里除2 106 if(maxvalue==-1) puts("0 0"); 107 else printf("%lld %lld\n",maxvalue,maxways); 108 } 109 return 0; 110 }
转载于:https://www.cnblogs.com/zyb993963526/p/7198529.html
POJ 2288 Islands and Bridges(状压dp)相关推荐
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- poj 2288 Islands and Bridges (状压dp+Tsp问题)
这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...
- poj -- 2288 Islands and Bridges
题意:给你n个岛屿,m条路,每个岛屿都有一个值vi,经过这个岛屿会得到这个值,规则: 1.经过所有的岛屿 sum += vi: 2.连续两个岛屿(即连通) sum += vi * vj: 3.连续三个 ...
- POJ - 2411 Mondriaan's Dream(状压dp)
题目链接:点击查看 题目大意:铺瓷砖 题目分析:经典之经典的状态压缩动态规划,具体的懒得说了,怠惰ing..一个月之前写的代码,还好当时注释做的好,现在稍微一看就能立马理解,码到博客上存着吧,三种方法 ...
- POJ 1185 炮兵阵地(状压DP)题解
思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k] ...
- POJ 1185 炮兵阵地(状压dp)
http://poj.org/problem?id=1185 题意: 思路: 每一行最多只有10列,所以可以用二进制来表示每一行的状态. d[i][j][k]表示第i行状态为k时,并且上一行状态为j时 ...
- CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】
虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位 \((n >> ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
最新文章
- Java传输对象模式
- CBNet和DetectoRS:COCO数据集霸榜模型
- python functools.reduce_Python-functools模块(reduce、partial、lru_cache)
- AngularJS快速入门指南09:SQL
- iframe css练习
- Leetcode刷题(5)最长公共前缀
- C# 合并多个不同格式文档为一个PDF
- mysql 索引 二_MySQL之索引(二)
- 图灵机概念的javascript演示
- 对外提供dubbo服务的最佳实践
- 在 Mac 上打开照片应用时遇到错误 4302,如何修复?
- su 与 su - 区别
- JAVA/JNI的jstring转换为char*
- matlab实现模拟退火算法
- Flutter ListView子项长按浮层菜单实现
- Docker--docker ps 命令与结果解析
- 在Unity3D中制作VR全景视频、图片
- 量化 ZIG函数的python实现
- 重装win7系统后打开截图工具显示“截图工具当前未在计算机上运行”怎么办
- 自动化办公 | 快速从Excel中提取图片并匹配命名
热门文章
- [GAN学习系列] 初始GAN
- 佳能g3800故障灯说明书_热水器维修电话|史密斯燃气热水器出现16故障码
- python改文件名_通过python顺序修改文件名字的方法
- k8s的认证和service account简述
- 不同操作系统打开文件浏览器(资源管理器)的方式
- Mvc5 控制器,视图简单说明
- WPF中的动画——(四)缓动函数
- 《那些年啊,那些事——一个程序员的奋斗史》——79
- 知识管理系统Data Solution研发日记之十二 网页数据抓取Fetch,呈现Render,导出Export...
- mysql用 fifo 记录日志_MySQL一丢丢知识点的了解