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比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...
随机推荐
- Cesium官方教程9--粒子系统
原文地址:https://cesiumjs.org/tutorials/Particle-Systems-Tutorial/ 粒子系统介绍 这篇教程带你学习Cesium的粒子相关API,比如如何在你的 ...
- Java +支付宝 +接入
说下业务场景, 公司之前的支付宝业务是PHP对接的现在改成 Java ,在接入出现不同的问题.之前PHP用的是老的移动支付, 现在Java的新接口 , 需要签约. 跟运维沟通好几次, 说签约不了, 只 ...
- Java超简明入门学习笔记(三)
Java编程思想第4版学习笔记(三) 第五章 初始化与清理(构造器和垃圾回收机制) Java有和C++类似的构造函数来为新创建的对象执行初始化及完成一些特殊的操作,有的类数据成员可能会 ...
- Activiti 部分实用功能
helloworld中已经写了关于部署流程图,查询个人任务,完成个人任务部分.现在添加几个新的实用功能 1.判断流程是否完成,代码如下 public void isProcessEnd() { Str ...
- elasticsearch 中文API 基于查询的删除(九)
基于查询的删除API 基于查询的删除API允许开发者基于查询删除一个或者多个索引.一个或者多个类型.下面是一个例子. import static org.elasticsearch.index.que ...
- 记录下sparkStream的做法(scala)
一直用storm做实时流的开发,之前系统学过spark但是一直没做个模版出来用,国庆节有时间准备做个sparkStream的模板用来防止以后公司要用.(功能模拟华为日常需求,db入库hadoop环境) ...
- vue-admin-template模板添加screenfull全屏插件
先安装screenfull:npm install screenfull@4.2.0 --save (注意版本号) 一.在\src\components目录下创建Screenfull文件夹,创建 ...
- Windows API 25篇 TerminateProcess
导语:结束一个进程的方法通常有:exit(), ExitProcess, TerminateProcess. 通常一个进程在正常情况下结束的话,系统会调用 ExitProcess函数结束进程,但有时候 ...
- windows API 第13篇 MoveFileEx
上一篇介绍了MoveFile,这次分析MoveFileEx,它是MoveFile的扩展函数,功能还要更加强大些.先看定义: BOOL WINAPI MoveFileEx( _In_ LPCTS ...
- sql 2000 or sql2005 数据库日志删除
数据库日志清理(sql 2000 or sql2005)DUMP TRANSACTION crm WITH NO_LOGBACKUP LOG crm WITH NO_LOGDBCC SHRINKDAT ...