POJ 2288 汉密尔顿回路 DP解决
题目大意:
有n个岛屿,令Vi为岛屿Ci的权值。一条汉密尔顿路径C1,C2,C3...Cn的值为3部分
第一部分,将路径中的岛的权值相加,第二部分将每条边上的(Ci,Cj),加上所有的Vi*Vj
第三部分,如果连续经过的3个城市可以形成3角联通,那么加上Vi*Vj*Vk
求出一条路径使其权值最大,并记录有多少可以达到最大权值的路径
1->2->3 , 3->2->1 视为相同路径
这里最多13个城市,所以用2进制表示是否到达当前位置的城市
这里用dp[i][k][j] 表示到达i状态时,最后到达的两个城市为j,k,这样可以达到的最大权值
dp[i|(1<<(t-1)][j][t] = max{dp[i|(1<<(t-1)][j][t] , dp[i][k][j]+val[t]+val[j]*val[t]+ edge[k][t]?val[j]*val[k]*val[t]:0}
注意每次更新dp值同时记录一个到达当前状态的路径数量cnt[i][k][j]
这里要注意只有一个城市的时候要特判
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
#define N 14
#define ll long long
int n,m;
ll dp[<<N][N][N] , val[N] , cnt[<<N][N][N];//cnt记录当前状态下可行的方法总数
bool edge[N][N]; void getDp()
{
memset(cnt , ,sizeof(cnt));
memset(dp , - , sizeof(dp));
int all = (<<n);
dp[][][]= , cnt[][][]=;
for(int i= ; i<=n ; i++) dp[<<(i-)][][i]=val[i],cnt[<<(i-)][][i]=;
for(int i= ; i<all ; i++){
for(int j= ; j<=n ; j++){
if(!(i&(<<(j-)))) continue;
for(int k= ; k<=n ; k++){
if(k == && (i!=(<<(j-)))) continue;
if(k==j || (!(i&(<<(k-))) && k!=)) continue;
if(dp[i][k][j]<) continue; for(int t= ; t<=n ; t++){
if(!edge[j][t] || i&(<<(t-))) continue;
ll v = dp[i][k][j]+val[t]+val[t]*val[j];
if(edge[t][k]) v = v+val[j]*val[k]*val[t];
int status = i|(<<(t-));
if(dp[status][j][t]< || dp[status][j][t]<v){
dp[status][j][t]=v;
cnt[status][j][t]=cnt[i][k][j];
}
else if(dp[status][j][t] == v){
cnt[status][j][t]+=cnt[i][k][j];
}
//debug
// print(status);cout<<endl;
// cout<<i<<" "<<j<<" "<<k<<" "<<dp[status][k][t]<<endl;
}
}
}
}
} int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
scanf("%d%d" , &n , &m);
for(int i= ; i<=n ; i++) scanf("%I64d" , val+i);
memset(edge , , sizeof(edge));
int a,b;
for(int i= ; i<m ; i++){
scanf("%d%d" , &a , &b);
edge[a][b]=true;
edge[b][a]=true;
}
getDp();
int all=(<<n);
ll maxn = - , ans=;
for(int i= ; i<=n ; i++)
for(int j= ; j<=n ; j++)
{
maxn=max(maxn,dp[all-][i][j]);
}
if(maxn == -){
puts("0 0");
continue;
}
for(int i= ; i<=n ; i++)
for(int j= ; j<=n ; j++)
if(maxn == dp[all-][i][j]) ans+=cnt[all-][i][j];
/***要注意只有一个城市的情况下要特判***/
printf("%I64d %I64d\n" , maxn , ans/?ans/:);
}
return ;
}
POJ 2288 汉密尔顿回路 DP解决的更多相关文章
- Islands and Bridges(POJ 2288状压dp)
题意:给你一个图和每个点的价值,边权值为连接两点权值的积,走哈密顿通路,若到达的点和上上个点相连则价值加三点乘积,求哈密顿通路的最大价值,和最大价值哈密顿通路的条数. 分析:开始看这个题很吓人,但想想 ...
- UVA1292-----Strategic game-----树形DP解决树上的最小点覆盖问题
本文出自:http://blog.csdn.net/dr5459 题目地址: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&a ...
- POJ.3624 Charm Bracelet(DP 01背包)
POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...
- 7-4 汉密尔顿回路(25 分) 【STL】
7-4 汉密尔顿回路(25 分) 著名的"汉密尔顿(Hamilton)回路问题"是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次).本题就要求你判断任一给定的回路是 ...
- POJ 1390 Blocks (区间DP) 题解
题意 t组数据,每组数据有n个方块,给出它们的颜色,每次消去的得分为相同颜色块个数的平方(要求连续),求最大得分. 首先看到这题我们发现我们要把大块尽可能放在一起才会有最大收益,我们要将相同颜色块合在 ...
- POJ 2995 Brackets 区间DP
POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...
- 蓝桥杯 试题 算法提高 宰羊 DP解决
问题描述 炫炫回了内蒙,肯定要吃羊肉啦,所有他家要宰羊吃. 炫炫家有N只羊,羊圈排成一排,标号1~N.炫炫每天吃掉一只羊(这食量!其实是放生啦),吃掉的羊的邻居会以为它被放生了,然后又会告诉他们的邻居 ...
- 蓝桥杯 试题 历届试题 对局匹配 DP解决
问题描述 小明喜欢在一个围棋网站上找别人在线对弈.这个网站上所有注册用户都有一个积分,代表他的围棋水平. 小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起.如果两人分差 ...
- poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)
题目:http://poj.org/problem?id=2288 不知为什么记忆化搜索就是WA得不得了! #include<iostream> #include<cstdio> ...
随机推荐
- 外文翻译 《How we decide》被情感愚弄 第一节
本节为第三章的起始. 书的导言 本节阅读感言:情感系统脱离控制的后果是毁灭性的. Ann Klinestiver 在一所高中做英文老师,她被诊断为患帕金森综合症.在课堂上,当她正准备和学生们谈及一些莎 ...
- hdu4003/蓝桥杯 金属采集
思路: 树形dp + 分组背包dp. 参考https://www.cnblogs.com/kuangbin/archive/2012/08/29/2661928.html 实现: #include & ...
- 各个浏览器CSS中的Bugs及解决方案
Bugs及解决方案列表(以下实例默认运行环境都为Standard mode): 如何在IE6及更早浏览器中定义小高度的容器? 方法: #test{overflow:hidden;height:1px; ...
- 我的关于phoneGap的安装及测试。
一.PhoneGap简介 PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够利用 iPhone,Android,Palm,S ...
- 【HEVC简介】DB-DeBlock Filter
参考论文:HEVC Deblocking Filter <HEVC标准介绍.HEVC帧间预测论文笔记>系列博客,目录见:http://www.cnblogs.com/DwyaneTalk/ ...
- 洛谷 P1726 上白泽慧音
题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间 ...
- BZOJ 1012: [JSOI2008]最大数maxnumber
★★ 输入文件:bzoj_1012.in 输出文件:bzoj_1012.out 简单对比时间限制:3 s 内存限制:162 MB [题目描述] 现在请求你维护一个数列,要求提供以下两种 ...
- 深入Docker 存储驱动 (转)
参考: http://static.dockerone.com/ppt/filedriver.html#28
- JS的本地保存localStorage、sessionStorage用法总结
localStorage 生命周期是永久的 这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在. sessionStorage 生命周期为当前窗口或标签 ...
- Java集合(六)--ArrayList、LinkedList和Vector对比
在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: Java集合(五)--LinkedList源码解读 Java集合(四)--基于JDK1.8的ArrayList源码解读 ...