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比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...
随机推荐
- java基础温习 -- 多态
1. 基本概念 多态是指一个事物有不同的表现形式或形态. 多态存在的三个必要条件:要有继承.要有重写.父类变量引用子类对象. 当使用多态方式调用方法时: 首先检查父类中是否有该方法,如 ...
- HtmlHelper1
<div> @using(Html.BeginForm("Test","Default")) { 4 @Html.TextBox("nam ...
- [Cqoi2015] 编号 【逆向思维,暴力枚举】
Online Judge:Luogu-P4222 Label:逆向思维,暴力枚举 题目描述 你需要给一批商品编号,其中每个编号都是一个7位16进制数(由0~9, a-f组成).为了防止在人工处理时不小 ...
- iTerm2配色和去掉profile提示框
效果: 配色方案代码地址: https://github.com/mbadolato/iTerm2-Color-Schemes 点击最右边的绿色区域,再点击 “import”, 打开刚下载解压好的文 ...
- 利用TensorFlow识别手写的数字---基于Softmax回归
1 MNIST数据集 MNIST数据集主要由一些手写数字的图片和相应的标签组成,图片一共有10类,分别对应从0-9,共10个阿拉伯数字.原始的MNIST数据库一共包含下面4个文件,见下表. 训练图像一 ...
- tensorflow高效地推导pb模型,完整代码
from matplotlib import pyplot as plt import numpy as np import os import six.moves.urllib as urllib ...
- numpy使用中的疑惑
numpy中有一些常用的用来产生随机数的函数,randn就是其中一个,randn函数位于numpy.random中,函数原型如下: numpy.random.randn(d0, d1, ..., dn ...
- Leetcode142. Linked List Cycle II环形链表2
给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶: 你是否可以不用额外空间解决此题? 方法一:使用map 方法二: 分两个步骤,首先通 ...
- 百度地图JavaScript API申请密钥注意要点
1.应用类型:浏览器端 2.启用服务:Javascript API要勾选 3.IP白名单:*即可
- Net基础面试题
1.c#访问修饰符有哪些,有何异同? private:私有类型,只用当前类可以访问 protected:访问包含类或者类派生的类 internal:程序集类型,在相同的命名空间内可以访问 public ...