poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)
题目:http://poj.org/problem?id=2288
不知为什么记忆化搜索就是WA得不得了!
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=,Lm=(<<)+;
int q,n,m,lm,v[N];
ll ans,prn,dp[Lm][N][N],f[Lm][N][N];
bool b[N][N];
ll dfs(int S,int x,int px)
{
if(dp[S][x][px]!=-)return dp[S][x][px];
if(S==lm){f[S][x][px]=;return dp[S][x][px]=;}
for(int i=;i<=n;i++)
if(b[x][i]&&(S&(<<(i-)))==)
{
int D=(S|(<<(i-)));
ll w=dfs(D,i,x)+v[i]+v[x]*v[i]+(b[px][i]?v[px]*v[x]*v[i]:);
if(w>dp[S][x][px])
dp[S][x][px]=w,f[S][x][px]=f[D][i][x];
else if(w==dp[S][x][px])
f[S][x][px]+=f[D][i][x];
}
return dp[S][x][px];
}
int main()
{
scanf("%d",&q);
while(q--)
{
memset(b,,sizeof b);
scanf("%d%d",&n,&m);lm=(<<n)-;
for(int i=;i<=n;i++)scanf("%d",&v[i]);
int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);b[x][y]=;b[y][x]=;
}
if(n==){printf("%d 1\n",v[]);continue;}//
memset(dp,-,sizeof dp);memset(f,,sizeof f);
ans=-;prn=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(b[i][j])
{
int D=((<<(i-))|(<<(j-)));//注意括号!
ll w=dfs(D,i,j)+v[i]*v[j]+v[i]+v[j];
if(w>ans)ans=w,prn=f[D][i][j];
else if(w==ans)prn+=f[D][i][j];
}
printf("%I64d %I64d\n",prn?ans:,prn>>);//
}
return ;
}
改成刷表就可A了。注意初始化一遍,然后开始dp,而不是一边初始化一边dp很多次。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,Lm=(<<)+;
int T,n,m,c[N],lm;
ll dp[Lm][N][N],f[Lm][N][N],ans,prn;
bool b[N][N];
int main()
{
scanf("%d",&T);
while(T--)
{
memset(b,,sizeof b);
scanf("%d%d",&n,&m);lm=(<<n)-;
for(int i=;i<=n;i++)scanf("%d",&c[i]);
int x,y;
while(m--)
{
scanf("%d%d",&x,&y);
b[x][y]=b[y][x]=;
}
if(n==){printf("%d 1\n",c[]);continue;}
memset(dp,-,sizeof dp);memset(f,,sizeof f);
for(int u=;u<=n;u++) for(int v=;v<=n;v++) if(b[u][v])
{
int s=((<<(u-))|(<<(v-)));
dp[s][u][v]=c[u]+c[v]+c[u]*c[v];
f[s][u][v]=;
}
for(int s=;s<=lm;s++)
for(int i=;i<=n;i++) if(s&(<<(i-)))
for(int j=;j<=n;j++) if(dp[s][i][j]!=-)
for(int k=;k<=n;k++) if(b[i][k]&&!(s&(<<(k-))))
{
int d=(s|(<<(k-)));
ll w=dp[s][i][j]+c[k]+c[i]*c[k]+(b[j][k]?c[i]*c[j]*c[k]:);
if(dp[d][k][i]<w)
{
dp[d][k][i]=w;
f[d][k][i]=f[s][i][j];
}
else if(dp[d][k][i]==w)
f[d][k][i]+=f[s][i][j];
}
ans=-;prn=;//因为有"prn?"
for(int i=;i<=n;i++) for(int j=;j<=n;j++) if(dp[lm][i][j]!=-)
if(dp[lm][i][j]>ans)ans=dp[lm][i][j],prn=f[lm][i][j];
else if(dp[lm][i][j]==ans)prn+=f[lm][i][j];
printf("%I64d %I64d\n",prn?ans:,prn>>);
}
return ;
}
poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)的更多相关文章
- poj 2288 Islands and Bridges ——状压DP
题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...
- poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题
题目链接 题目描述:哈密尔顿路问题.n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每一个点的权值之和 2.对于图中的每一条CiC ...
- [poj2288] Islands and Bridges (状压dp)
Description Given a map of islands and bridges that connect these islands, a Hamilton path, as we al ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- POJ 2411 Mondriaan's Dream ——状压DP 插头DP
[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...
- 【POJ 2923】Relocation(状压DP+DP)
题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...
- POJ 1185 炮兵阵地 (状压DP)
题目链接 题意 : 中文题不详述. 思路 :状压DP,1表示该位置放炮弹,0表示不放.dp[i][j][k],代表第 i 行的状态为k时第i-1行的状态为 j 时放置的最大炮弹数.只是注意判断的时候不 ...
- 动态规划晋级——POJ 3254 Corn Fields【状压DP】
转载请注明出处:http://blog.csdn.net/a1dark 分析:刚开始学状压DP比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...
随机推荐
- 表单下拉框select
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...
- pycharm优化
一.版本选择 建议安装5.0版本,因为好注册,这个你懂得. 下载地址: https://confluence.jetbrains.com/display/PYH/Previous+PyCharm+Re ...
- [原创]新版PageOffice V4.0为什么用弹出窗口的方式打开文件?
前的包含文档处理功能的Web办公系统,在打开文档的时候,一部分系统是采用Office文档嵌入到主窗口页面中右侧工作区域的方式,另一部分系统采用的是弹出新的浏览器窗口,里面完整的嵌入Office文件的打 ...
- Ubuntu下U盘能看见盘符但打不开
查看U盘状态 sudo fdisk -l 格式化 sudo mkfs -t vfat -I /dev/sdb1 sudo mkfs -t ntfs -I /dev/sdb1 sudo mkfs -t ...
- adb的安装及配置
1.下载adb的安装包进行下载 2.将安装报进行解压 3.配置环境变量,将adb的根目录添加到path环境变量中 4.在终端命令行中输入adb servion命令,检查是否安装成功,如显示版本号则安 ...
- 论文翻译——R-CNN(目标检测开山之作)
R-CNN论文翻译 <Rich feature hierarchies for accurate object detection and semantic segmentation> 用 ...
- NCDC 天气数据的预处理
"Hadoop: The Definitive Guild" 这本书的例子都是使用NCDC 天气数据的,但由于书的出版和现在已经有一段时间了,NCDC现在提供的原始数据结构已经有了 ...
- 如何在Mac上切换python2和python3以及下载安装包 & 在Mac上如何查找系统自带python2.7的路径
电脑:系统是Mac OS 系统自带python2.7 自己下载安装了python3.6 问题:一开始我想在终端下执行python2的相关代码 例如 python kNN.py (kNN.py这 ...
- Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- mysql基础教程(三)-----增删改、子查询、创建管理表、约束和分页
插入 INSERT语句语法 从其它表中拷贝数据 • 不必书写 VALUES 子句. • 子查询中的值列表应与 INSERT 子句中的列名对应 update语句 • 可以一次更新多条数据. • 如果需要 ...