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比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...
随机推荐
- jeecms v9库内新增对象的流程及其他技巧
cms 开发 ———— 库内新增对象 Products 的流程说明及其他技巧 第一步:Entity com.jeecms.cms.entity.assist.base下建立模型基础类BaseCmsPr ...
- springmvc前端控制器拦截路径的配置报错404
1.拦截"/",可以实现现在很流行的REST风格.很多互联网类型的应用很喜欢这种风格的URL.为了实现REST风格,拦截除了jsp的所有. 2.拦截/*,拦截所有访问,会导致404 ...
- Jmeter接口测试(第二篇)
一.新建项目 1.运行Jmeter.bat打开Jmeter 2.添加线程组(测试计划->添加->Thread(users)->线程组) 3.添加HTTP请求(线程组->添加-& ...
- mapduce简介
原文引自:http://www.cnblogs.com/shishanyuan/p/4639519.html 1.环境说明 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shi ...
- mysql 中将汉字(中文)按照拼音首字母排序
因为数据库中可以设定表的编码格式,不同编码格式下,中文的排序有区别,下面分别介绍常用编码下的排序方法. 1.如果数据表的某字段的字符编码是 utf8_general_ci,排序写法: ORDER BY ...
- 解决element-ui表头错位的问题
经过测试得出: 使用element-ui的表格,并在table中设置固定height会出现表头错位的现象(不知道是什么bug) 解决方案: 将height改为max-height,设置固定高度为最大高 ...
- Windowns API 第24篇 WTSEnumerateSessions 枚举session信息
函数原型: BOOL WTSEnumerateSessions( HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFO* p ...
- Angularjs 1 使用filter格式化输出href
Angularjs版本: 1.3.5 工作中,由于是多级菜单,如果上级菜单为空,就会访问Angularjs 默认的state,然后再展开菜单,我找资料之后,才知道是通过filter来格式化输出数据的, ...
- C#墨攻IOC[转]
原文叫看<墨攻>理解IOC概念 2006年多部贺岁大片以让人应接不暇的频率纷至沓来,其中张之亮的<墨攻>算是比较出彩的一部,讲述了战国时期墨家人革离帮助梁 国反抗赵国侵略的个人 ...
- github的账号密码 redis windows版连接方式
账号:Pinshuducha 邮箱:java_zhoulu@163.com 密码:zhoulu1994 服务器端: 启动:redis-server.exe redis.windows.conf 客户端 ...