题意:

  给你一张地图,上面有一些岛和桥。你要求出最大的三角哈密顿路径,以及他们的数量。

  哈密顿路:一条经过所有岛的路径,每个岛只经过一次。

  最大三角哈密顿路:满足价值最大的哈密顿路。

    价值计算分为以下三部分:

      1. 所有点权的和。

      2. 对于路径上任意两个连续的点(共享一条边)的点权乘积的和。

      3. 对于路径上任意三个连续的点,如果他们构成一个三角形(两两之间有边),那么加上三点点权的乘积

思路:

  状态压缩动态规划, dp[st][i][j] 表示状态是st, 前一步在i,现在停在j的最大价值。

    cnt[st][i][j] 表示计数。

代码:

 #include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; typedef __int64 ll; const int MAXN= ; ll dp[<<][MAXN][MAXN];
ll cnt[<<][MAXN][MAXN]; int G[][];
ll val[];
int n, m; void print() {
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++)
printf("%d ", G[i][j]);
puts("");
}
} int main() {
#ifdef Phantom01
freopen("PKU2288.txt", "r", stdin);
#endif // Phantom01 int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
memset(dp, , sizeof(dp));
memset(cnt, , sizeof(cnt));
memset(G, , sizeof(G));
for (int i = ; i < n; i++) {
scanf("%I64d", &val[i]);
}
for (int i = ; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u-][v-] += ;
G[v-][u-] += ;
}
//print();
if (==n) {
printf("%I64d 1\n", val[]);
continue;
} for (int i = ; i < n; i++)
for (int j = ; j < n; j++) if (G[i][j]){
dp[(<<i)|(<<j)][i][j] = val[i] + val[j] + val[i]*val[j];
cnt[(<<i)|(<<j)][i][j] += G[i][j];
} for (int i = ; i < (<<n)-; i++)
for (int j = ; j < n; j++) if (i&(<<j))
for (int u = ; u < n; u++) if ((i&(<<u)) && (j!=u) && cnt[i][j][u])
for (int v = ; v < n; v++) if (G[u][v] && !(i&(<<v))) {
ll &now = dp[i][j][u];
ll &next = dp[i|(<<v)][u][v];
ll va = val[v]*( + val[u]);
if (G[j][v]) va += val[j]*val[u]*val[v];
if (next < now+va) {
next = now+va;
cnt[i|(<<v)][u][v] = cnt[i][j][u];
} else if (next==now+va)
cnt[i|(<<v)][u][v] += cnt[i][j][u];
} ll ans = , c = ;
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
if (ans<dp[(<<n)-][i][j]) {
ans = dp[(<<n)-][i][j];
c = cnt[(<<n)-][i][j];
} else if (ans==dp[(<<n)-][i][j])
c += cnt[(<<n)-][i][j]; printf("%I64d %I64d\n", ans, c/);
} return ;
}

PKU2288

P.s.: 开始多开了一维导致MLE,后来发现读错题了 0 0 结果花了一晚上

PKU 2288 Islands and Bridges 状态dp的更多相关文章

  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,变形)

    题意: 给一个无向图,n个点m条边,每个点有点权,要求找到一条哈密顿路径,使得该路径的f(path)值最大.输出f值,若有多条最大f值的路径,输出路径数量. f值由如下3点累加而来: (1)所有点权之 ...

  3. poj 2288 Islands and Bridges ——状压DP

    题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...

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

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

  5. poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)

    题目:http://poj.org/problem?id=2288 不知为什么记忆化搜索就是WA得不得了! #include<iostream> #include<cstdio> ...

  6. POJ 2288 Islands and Bridges(状压DP)题解

    题意:n个点,m有向边,w[i]表示i的价值,求价值最大的哈密顿图(只经过所有点一次).价值为:所有点的w之和,加上,每条边的价值 = w[i] * w[j],加上,如果连续的三个点相互连接的价值 = ...

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

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

  8. 【以前的空间】poj 2288 Islands and Bridges

    一个不错的题解 : http://blog.csdn.net/accry/article/details/6607703 这是一道状态压缩.每个点有一个值,我们最后要求一个最值sum.sum由三部分组 ...

  9. poj 2288 Islands and Bridges

    题意: 给你一个双向连通图,求 获得权值最大 的 哈密顿通路的 权值 和 这个权值对应的数目: 其中权值计算方法是  列如 ABCD  权值是a+b+c+d+ab+bc+cd 如果 A,B,C  和B ...

随机推荐

  1. hiho 1564 - 简单dfs + 宏的危害!!!

    题目链接 H公司有 N 台服务器,编号1~N,组成了一个树形结构.其中中央服务器处于根节点,终端服务器处于叶子节点. 中央服务器会向终端服务器发送消息.一条消息会通过中间节点,到达所有的终端服务器.消 ...

  2. SQL中一次插入多条数据

    SQL中insert一次可以插入一条数据,我们有三种方法可以一次性插入多条数据. 1. 语法:select 字段列表 into 新表 from 源表 注意事项:此种方法新表是系统自动创建,语句执行前不 ...

  3. 玩转HTML5移动页面(动效篇)

    为一名前端,在拿到设计稿时你有两种选择: 快速输出静态页面 加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有志向的前端,当然是选2啦!可是需求时间又很短很短,怎么办呢? 这次就来谈谈一些 ...

  4. selenium自动化(三).........................................框架篇

    三.Unittest框架介绍: 1.Unittest类似于java中的Junit,功能较为简单,逻辑简单,理解和使用起来比较简单 1)       安装:自带框架,无需安装 2)       使用:可 ...

  5. webpack中optimization 的 runtimeChunk 是干嘛的

    结论:把runtime部分的代码抽离出来单独打包 https://developers.google.com/web/fundamentals/performance/webpack/use-long ...

  6. BZOJ 3261 最大异或和 (可持久化01Trie)

    题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...

  7. 【PRML学习笔记】第四章:分类的线性模型

    一.基础概念 线性分类模型:决策面(decision boundary)是输入向量的线性函数 目标类别的表示"1 of K" :$ t = (0,1,0,0,0)^T$ 二.分类问 ...

  8. php5权限控制修饰符

    1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...

  9. Linux 进程间通信(IPC)

    Linux 进程间通信(IPC): Linux系统中除了进程和进程之间通信,我想大家也应该关注用户空间与内核空间是怎样通信的.例如说netlink等等. 除了传统进程间通信外像Socket通信也须要掌 ...

  10. hdoj-5099-Comparison of Android versions

    Comparison of Android versions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...