poj 2288
解题思路
状压dp,记录路径条数,dp[S][i][j]表示状态为S,前一个点是i,再前一个点是j的最大值,然后在开个一样的数组记录方案数,时间复杂度O(2^n*n^2),注意要用long long,还有数据有一个点的情况。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int N = 14;
typedef long long LL;
const int inf = -0x3f3f3f3f;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int q,n,m,a[N][N],val[N];
LL dp[1<<N][N][N],num[1<<N][N][N],ans,ans_num;
signed main(){
q=rd();
while(q--){
ans=0,ans_num=0;
memset(a,0,sizeof(a));
memset(dp,-0x3f,sizeof(dp));
memset(num,0,sizeof(num));
n=rd(),m=rd();register int x,y;
for(register int i=1;i<=n;i++) val[i]=rd();
for(register int i=1;i<=m;i++) {
x=rd(),y=rd();
a[x][y]=a[y][x]=1;
}
dp[0][0][0]=0;num[0][0][0]=1;
for(register int i=0;i<(1<<n)-1;i++)
for(register int j=1;j<=n;j++)if(!((1<<j-1)&i))
for(register int k=0;k<=n;k++)if(((1<<k-1)&i && a[j][k]) || k==0)
for(register int p=0;p<=n;p++)if(((1<<p-1)&i && a[p][k]) || p==0){
if(dp[i][k][p]==-inf) continue;
LL now=dp[i][k][p]+val[j]+(LL)val[j]*val[k];
if(a[j][p]) now+=(LL)val[j]*val[k]*val[p];
if(dp[i|(1<<j-1)][j][k]==now)
num[i|(1<<j-1)][j][k]+=num[i][k][p];
else if(dp[i|(1<<j-1)][j][k]<now){
dp[i|(1<<j-1)][j][k]=now;
num[i|(1<<j-1)][j][k]=num[i][k][p];
}
}
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n;j++)
if(a[i][j]) {
if(dp[(1<<n)-1][i][j]>ans) {ans=dp[(1<<n)-1][i][j];ans_num=num[(1<<n)-1][i][j];}
else if(dp[(1<<n)-1][i][j]==ans) ans_num+=num[(1<<n)-1][i][j];
}
if(n==1 && m==0) {ans=val[1];ans_num=2;}
cout<<ans<<" "<<ans_num/2<<endl;
}
return 0;
}
poj 2288的更多相关文章
- poj 2288 tsp经典问题
题目链接:http://poj.org/problem?id=2288 #include<cstdio> #include<cstring> #include<iostr ...
- POJ 2288 Islands and Bridges(状压dp)
http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...
- poj 2288 Islands and Bridges ——状压DP
题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...
- poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)
题目:http://poj.org/problem?id=2288 不知为什么记忆化搜索就是WA得不得了! #include<iostream> #include<cstdio> ...
- poj 2288 Islands and Bridges
题意: 给你一个双向连通图,求 获得权值最大 的 哈密顿通路的 权值 和 这个权值对应的数目: 其中权值计算方法是 列如 ABCD 权值是a+b+c+d+ab+bc+cd 如果 A,B,C 和B ...
- DP:Islands and Bridges(POJ 2288)
2015-09-21 造桥基建工程 题目大意,就是有n座岛和k座桥,要你找一条哈密顿圈(找完所有的岛,并且每个岛只经过一次),当经过一座岛就加上岛的价值,如果两岛联通,则加上两座岛的价值之积,如果三座 ...
- Islands and Bridges(POJ 2288状压dp)
题意:给你一个图和每个点的价值,边权值为连接两点权值的积,走哈密顿通路,若到达的点和上上个点相连则价值加三点乘积,求哈密顿通路的最大价值,和最大价值哈密顿通路的条数. 分析:开始看这个题很吓人,但想想 ...
- poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题
题目链接 题目描述:哈密尔顿路问题.n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每一个点的权值之和 2.对于图中的每一条CiC ...
- 【以前的空间】poj 2288 Islands and Bridges
一个不错的题解 : http://blog.csdn.net/accry/article/details/6607703 这是一道状态压缩.每个点有一个值,我们最后要求一个最值sum.sum由三部分组 ...
- POJ 2288 Islands and Bridges (状压DP,变形)
题意: 给一个无向图,n个点m条边,每个点有点权,要求找到一条哈密顿路径,使得该路径的f(path)值最大.输出f值,若有多条最大f值的路径,输出路径数量. f值由如下3点累加而来: (1)所有点权之 ...
随机推荐
- lxhgww的奇思妙想 长链剖分板子
https://vijos.org/d/Bashu_OIers/p/5a79a3e1d3d8a103be7e2b81 求k级祖先,预处理nlogn,查询o1 //#pragma GCC optimiz ...
- 背包dp+打表处理——cf999F
考虑每种c都是可以独立进行计算的,所以这题的答案等价于每种c的最优解之和 计算每种c的最优解:把问题转化成求出每种c的最大值,再转化成i个人分j张卡片的最大收益 dp[i,j]表示i个人分j张卡片的最 ...
- 学习Caffe(一)使用Caffe
如何使用Caffe Caffe教程(http://robots.princeton.edu/courses/COS598/2015sp/slides/Caffe/caffe_tutorial.pdf) ...
- npm run server报错
从git上clone的vue项目npm install后npm run server报错 $ npm run dev > lufei@1.0.0 dev E:\pythonProject\luf ...
- 一篇关于Matcher find方法深刻理解的文章
文章目录 知识点 find find(int var1) reset group(int var1) 源码 故事是这样的 探索 问题解决 方法一: 方法二: 方法三: 总结 知识点 find 首先fi ...
- HDU-6375-度度熊学队列-双端队列deque/list
度度熊正在学习双端队列,他对其翻转和合并产生了很大的兴趣. 初始时有 NN 个空的双端队列(编号为 11 到 NN ),你要支持度度熊的 QQ 次操作. ①11 uu ww valval 在编号为 u ...
- namespace 命名空间
namespace作用:资源隔离 当我们不指定namespace时,默认放在default下 创建namespace kubectl create namespace 资源名称 在生产中,我们建议一个 ...
- axel 参数 文件下载地址
axel 参数 文件下载地址 可选参数: -n 指定线程数 -o 指定另存为目录 -s 指定每秒的最大比特数 -q 静默模式 实例 axel -n 10 -o /tmp/ http://testdow ...
- 廖雪峰Java13网络编程-3其他-1HTTP编程
1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是 ...
- 三剑客之一------>awk
awk : 一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...