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)相关推荐

  1. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  2. poj 2288 Islands and Bridges (状压dp+Tsp问题)

    这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...

  3. poj -- 2288 Islands and Bridges

    题意:给你n个岛屿,m条路,每个岛屿都有一个值vi,经过这个岛屿会得到这个值,规则: 1.经过所有的岛屿 sum += vi: 2.连续两个岛屿(即连通) sum += vi * vj: 3.连续三个 ...

  4. POJ - 2411 Mondriaan's Dream(状压dp)

    题目链接:点击查看 题目大意:铺瓷砖 题目分析:经典之经典的状态压缩动态规划,具体的懒得说了,怠惰ing..一个月之前写的代码,还好当时注释做的好,现在稍微一看就能立马理解,码到博客上存着吧,三种方法 ...

  5. POJ 1185 炮兵阵地(状压DP)题解

    思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k] ...

  6. POJ 1185 炮兵阵地(状压dp)

    http://poj.org/problem?id=1185 题意: 思路: 每一行最多只有10列,所以可以用二进制来表示每一行的状态. d[i][j][k]表示第i行状态为k时,并且上一行状态为j时 ...

  7. CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】

    虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位                                                    \((n >> ...

  8. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  9. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

最新文章

  1. Java传输对象模式
  2. CBNet和DetectoRS:COCO数据集霸榜模型
  3. python functools.reduce_Python-functools模块(reduce、partial、lru_cache)
  4. AngularJS快速入门指南09:SQL
  5. iframe css练习
  6. Leetcode刷题(5)最长公共前缀
  7. C# 合并多个不同格式文档为一个PDF
  8. mysql 索引 二_MySQL之索引(二)
  9. 图灵机概念的javascript演示
  10. 对外提供dubbo服务的最佳实践
  11. 在 Mac 上打开照片应用时遇到错误 4302,如何修复?
  12. su 与 su - 区别
  13. JAVA/JNI的jstring转换为char*
  14. matlab实现模拟退火算法
  15. Flutter ListView子项长按浮层菜单实现
  16. Docker--docker ps 命令与结果解析
  17. 在Unity3D中制作VR全景视频、图片
  18. 量化 ZIG函数的python实现
  19. 重装win7系统后打开截图工具显示“截图工具当前未在计算机上运行”怎么办
  20. 自动化办公 | 快速从Excel中提取图片并匹配命名

热门文章

  1. [GAN学习系列] 初始GAN
  2. 佳能g3800故障灯说明书_热水器维修电话|史密斯燃气热水器出现16故障码
  3. python改文件名_通过python顺序修改文件名字的方法
  4. k8s的认证和service account简述
  5. 不同操作系统打开文件浏览器(资源管理器)的方式
  6. Mvc5 控制器,视图简单说明
  7. WPF中的动画——(四)缓动函数
  8. 《那些年啊,那些事——一个程序员的奋斗史》——79
  9. 知识管理系统Data Solution研发日记之十二 网页数据抓取Fetch,呈现Render,导出Export...
  10. mysql用 fifo 记录日志_MySQL一丢丢知识点的了解