题意:给你n个岛屿,m条路,每个岛屿都有一个值vi,经过这个岛屿会得到这个值,规则:

1、经过所有的岛屿 sum += vi;

2、连续两个岛屿(即连通) sum += vi * vj;

3、连续三个岛屿(即两两连通)sum += vi + vj + vk;

求得到最大的值,并且问的到最大的值有多少种路线;(最后的路线/2,无向图)

dp[i][j][k] 表示第i个状态 j-->k 得到的最大值

s[i][j][k] 表示第i个状态 j-->k 得到的最大值的路线的数量

注:1001 ---> 1101       1的位置与0的位置和3的位置有关 

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef __int64 LL;
#define M 1<<14
LL dp[M][14][14];
LL s[M][14][14];
LL v[14];
int map[14][14];
int n,m;
void DP()
{int cnt = 1 << n;for(int i = 0;i < cnt;i++){for(int j = 0;j < n;j++){for(int k = 0;k < n;k++){if(dp[i][j][k] == -1) continue;for(int r = 0;r < n;r++){if(r == j || r == k || i&(1<<r) || !map[k][r]) continue;LL xx = v[r] + v[r] * v[k] + dp[i][j][k];if(map[j][r]) xx += v[j] * v[k] * v[r];LL& Vmax = dp[i+(1<<r)][k][r];if(Vmax  < xx){Vmax = xx;s[i+(1<<r)][k][r] = s[i][j][k];}else if(Vmax == xx)s[i+(1<<r)][k][r] += s[i][j][k];}}}}LL ans = 0;LL num = 0;for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){if(dp[cnt-1][i][j] == -1) continue;if(dp[cnt-1][i][j] > ans){ans = dp[cnt-1][i][j];num = s[cnt-1][i][j];}else if(dp[cnt-1][i][j] == ans)num += s[cnt-1][i][j];}}if(num) cout << ans << " " << num/2 << endl;else cout << "0 0" << endl;
}
int main()
{int t,u,w;cin >> t;while(t--){cin >> n >> m;for(int i = 0;i < n;i++)cin >> v[i];memset(map,0,sizeof(map));memset(dp,-1,sizeof(dp));memset(s,0,sizeof(s));for(int i = 0;i < m;i++){cin >> u >> w;u -- ; w --;map[u][w] = map[w][u] = 1;int st = (1 << u) + (1 << w);dp[st][u][w] = dp[st][w][u] = v[u] + v[w] + v[u] * v[w] ;s[st][u][w] = s[st][w][u] = 1;}if(n == 1){cout << v[0] << " 1" << endl;continue;}DP();}
}

poj -- 2288 Islands and Bridges相关推荐

  1. POJ 2288 Islands and Bridges(状压dp)

    http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...

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

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

  3. poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题

    题目链接 题目描写叙述:哈密尔顿路问题.n个点,每个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每个点的权值之和 2.对于图中的每一条CiC ...

  4. Islands and Bridges 题解

    Islands and Bridges Description 给定一些岛屿和一些连接岛屿的桥梁,大家都知道汉密尔顿路是访问每个岛屿一次的路线,在我们这个地图中,每个岛屿有个正整数的权值,表示这个岛屿 ...

  5. Islands and bridges

    Description 给定一些岛屿和一些连接岛屿的桥梁,大家都知道汉密尔顿路是访问每个岛屿一次的路线,在我们这个地图中,每个岛屿有个正整数的权值,表示这个岛屿的观赏价值.假设一共有N个岛屿,用Vi表 ...

  6. poj 2288(状态压缩dp + TSP问题)

    题目描述:哈密尔顿路问题.n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每一个点的权值之和 2.对于图中的每一条CiCi+1,加 ...

  7. [置顶] 状态压缩DP 简单入门题 11题

    1.每一行用一个二进制数表示, 有些二进制数是题目中不合法的状态,我们可以预处理出一行合法状态的个数,在递推的过程中复杂度就会大大降低. POJ 3254        Corn Fields     ...

  8. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  9. POJ 动态规划题目列表

    1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号: 容易:  1018, 1050 ...

最新文章

  1. R语言计算F1评估指标实战:F1 score、使用R中caret包中的confusionMatrix()函数为给定的logistic回归模型计算F1得分(和其他指标)
  2. java web调用c_Java调用C/C++程序
  3. html5 居于页面中心,css笔记:如何让一个div居于页面正中间
  4. Scrum联盟发布《2016年度Scrum状态调查报告》
  5. 数据库事务原理详解-数据库隔离级别
  6. 失望时想起了你是什么歌_你是空你是空是什么歌 你是风你是风什么歌
  7. 斯坦福大学Andrew Ng - 机器学习笔记(8) -- 推荐系统 大规模机器学习 图片文字识别...
  8. 对老赖 绝不要忍 !一位美女程序媛的讨薪经历...
  9. 中国大学MOOC-数据结构基础习题集、06-3、公路村村通
  10. cesium学习笔记(问题记录)——以cesium1.77版本为例
  11. ajax后台返回数据中文乱码_ajax返回的数据是乱码????
  12. C++程序的构成和书写形式
  13. 使用JUnit-4.11报java.lang.NoClassDefFoundError:
  14. 【linux】一次性杀死多个同名进程
  15. html中滚动条属性设置
  16. 计算机中年级排名怎么操作,智学网怎么查看年级排名?智学网查看年级排名的方法...
  17. TrueCrypt介绍及入门使用讲解【翻译】
  18. 《Python》典型数据结构
  19. Codeblocks 新建操作(单c文件新建和c工程创建)
  20. 用python写一个贪吃蛇小游戏

热门文章

  1. 干货:如何在前端统计用户访问来源?
  2. CrazyDiskInfo硬盘检测工具 安装记录
  3. 为什么我从 npm 到 yarn 再到 npm?
  4. Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系
  5. 【Win 10 应用开发】文件读写的三种方案
  6. Android四大组件ContentProvider
  7. Blockchain Patent Players and domain
  8. 硕士:论文提交和考试
  9. how you can do to make girls more close to you?
  10. 可能没有很好的重工业转型的case