题意:

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

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

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

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

      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. 关于jsp web项目,jsp页面与servlet数据不同步的解决办法(报错404、405等)即访问.jsp和访问web.xml中注册的/servlet/的区别

    报错信息: Type Status Report Message HTTP method GET is not supported by this URL Description The method ...

  2. hiho152周 - 水题 区间问题

    题目链接 给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1, A2 ], [ A3, A4 ], ..., [ A2N-1, A2N ],集合 B 包含 M 个区间[ B1, B2 ...

  3. React 第一天

    第一天 从webpack到babel再到React.js Vue是如何实现组件化的: 通过.vue文件,来创建对应的组件: ·template 结构 ·script 行为 ·style 样式 Reac ...

  4. [SCOI2016]美味(可持久化线段树)

    可持久化trie树?好像和可持久化权值线段树差不多.. 如果这题没有那个\(x[i]\)这题就是一个裸的可持久化trie树. 仔细想想,多了这个\(x[i]\)之后有什么影响? 就是我们查询区间的时候 ...

  5. LCT复习

    LCT,虚实链剖分.支持连边和断边操作.Tarjan制造. [HNOI2010]弹飞绵羊 当然这题分块可以做,常数小,但是LCT更无脑. 建立一个虚拟的弹飞节点\(n+1\),初始化时对于一个点假如再 ...

  6. luogu P1405 苦恼的小明(欧拉定理)

    题意 求a1^a2^a3^...^an(mod10007)n<=1000000,a[i]<=10000 题解 明眼人一眼就可以看出是欧拉定理的推论. 首先这个题是错的,没说保证互质. 然而 ...

  7. HDU 1667 The Rotation Game (A*迭代搜索)

    题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...

  8. 【BZOJ 1196】[HNOI2006]公路修建问题

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二分最后选的边中的最大值是多少. mid 则所有边权小于等于mid的边都可以用了. 那么我们要怎么选择呢? ->优先选择一级的 ...

  9. root用户删除文件提示:Operation not permitted

    root用户删除文件提示:Operation not permitted http://blog.csdn.net/evanbai/article/details/6187578

  10. Qt之QSS(动态属性)

    简述 QSS可以定制应用程序的外观,无需关注Qt样式背后的魔力.从非常轻微到极其复杂的调整,样式表都可以做到.对于一个完全定制和独特的用户体验,QtQuick和QGraphicsView是更好的选择. ...