题意:

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

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

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

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

      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. javascript常用代码(不完整版)

    求大神指点 Javascript嵌入式 <script typt:javascript>代码</script> 注释 //或者/*内容*/ 变量名赋值 Var 变量名 = 值 ...

  2. 1,http协议的细节部分学习

    http协议(80端口)https(443端口) 主要是一直对三次握手模模糊糊,并且抓包的时候不知道那些Accept.User-Agent什么意思,就仔细找课程学了一下. 学习简介: 1,涉及工具(w ...

  3. pthread_cleanup_push vs Autorelease VS 异常处理

    黑幕背后的Autorelease http://www.cnblogs.com/feng9exe/p/7239552.html objc_autoreleasePoolPush的返回值正是这个哨兵对象 ...

  4. Python 批量处理特定格式文件

    #批量对文件夹下的'.mat'进行处理 def file_name(file_dir,suff): L=[] for root, dirs, files in os.walk(file_dir): f ...

  5. 通过nodeSelector配置项实现pod部署至指定node

    Node节点添加标签 [root@node1 work]# kubectl label nodes node1 node=master --overwrite node/node1 labeled [ ...

  6. 关于Jwt的一些思考

    在使用jwt的过程中发现了两个问题续期和退出的问题. 续期 因为jwt的token在签发之后是有过期时间的,所以就存在管理这个过期时间的问题.我看网上有提出解决方案的大致有下面几个 每次更新过期时间, ...

  7. Axios 使用时遇到的问题

    最近使用 vue 构建一个小项目,在使用 axios 发送 post 请求的时候,发现 axios 发送数据默认使用 json 格式,百度搜了下,更改 ContentType 不管用,最终问题原来是: ...

  8. DBCA创建数据库ORA-01034 ORACLE not available

    SYMPTOMS 在利用dbca创建数据库时,当设置完毕全部參数.開始装时 跑到2% 就报错 ORA-01034 ORACLE not available, 例如以下图 watermark/2/tex ...

  9. 错误处理:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter

    部署项目时,启动Tomcat一直出错:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter SEVE ...

  10. Leetcode:Singel Number

    问题描写叙述: Given an array of integers, every element appears twice except for one. Find that single one ...