题目:http://poj.org/problem?id=2288

状压挺明显的;

一开始写了(记忆化)搜索,但一直T;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const inf=0x3f3f3f3f;
int T,n,m,v[];
ll ans,cnt,f[<<];
bool mp[][];
void dfs(int z,int x,int y,ll w)
{
if(w<f[z])return;
f[z]=w;
if(z==(<<n)-)
{
if(w>ans)ans=w,cnt=;
else if(w==ans)cnt++;
return;
}
for(int i=;i<=n;i++)
if((z&(<<(i-)))==)
dfs(z|(<<(i-)),y,i,w+v[i]+v[y]*v[i]+(mp[x][i]?v[x]*v[y]*v[i]:));
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(f,,sizeof f);
memset(mp,,sizeof mp);
ans=-inf; cnt=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&v[i]);
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
mp[x][y]=; mp[y][x]=;
}
dfs(,,,);
if(cnt==)printf("0 0\n");
else printf("%lld %lld\n",ans,cnt/);
}
return ;
}

于是改成刷表,注意点细节就行了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const inf=0x3f3f3f3f;
int T,n,m,v[];
ll ans,cnt,f[<<|][][],s[<<|][][];
bool mp[][];
void dp()
{
memset(f,-,sizeof f);
memset(s,,sizeof s);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) if(mp[i][j])
{
int p=((<<(i-))|(<<(j-)));
f[p][i][j]=v[i]+v[j]+v[i]*v[j]; s[p][i][j]=;
}
for(int p=;p<(<<n);p++)
for(int i=;i<=n;i++) if(!(p&(<<(i-))))
for(int j=;j<=n;j++) if(p&(<<(j-)))
for(int k=;k<=n;k++) if((p&(<<(k-)))&&j!=k&&mp[i][k]&&f[p][j][k]!=-)
{
ll tmp=f[p][j][k]+v[i]+v[k]*v[i]+(mp[j][i]?v[j]*v[k]*v[i]:);
int tp=(p|(<<(i-)));
if(tmp>f[tp][k][i]) f[tp][k][i]=tmp,s[tp][k][i]=s[p][j][k];
else if(tmp==f[tp][k][i])s[tp][k][i]+=s[p][j][k];
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(mp,,sizeof mp);
ans=-inf; cnt=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&v[i]);
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
mp[x][y]=; mp[y][x]=;
}
if(n==){printf("%d %d\n",v[],); continue;}//
dp(); int mx=(<<n)-;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) if(i!=j)
{
if(f[mx][i][j]==ans)cnt+=s[mx][i][j];
else if(f[mx][i][j]>ans)ans=f[mx][i][j],cnt=s[mx][i][j];
}
if(cnt==)printf("0 0\n");//
else printf("%I64d %I64d\n",ans,cnt/);//
}
return ;
}

poj 2288 Islands and Bridges ——状压DP的更多相关文章

  1. poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)

    题目:http://poj.org/problem?id=2288 不知为什么记忆化搜索就是WA得不得了! #include<iostream> #include<cstdio> ...

  2. [poj2288] Islands and Bridges (状压dp)

    Description Given a map of islands and bridges that connect these islands, a Hamilton path, as we al ...

  3. POJ 1185 炮兵阵地(状压DP)

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26426   Accepted: 10185 Descriptio ...

  4. POJ 2411 Mondriaan's Dream -- 状压DP

    题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...

  5. POJ 2411 Mondriaan's Dream ——状压DP 插头DP

    [题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...

  6. 【POJ 2923】Relocation(状压DP+DP)

    题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...

  7. POJ 1185 炮兵阵地 (状压DP)

    题目链接 题意 : 中文题不详述. 思路 :状压DP,1表示该位置放炮弹,0表示不放.dp[i][j][k],代表第 i 行的状态为k时第i-1行的状态为 j 时放置的最大炮弹数.只是注意判断的时候不 ...

  8. 动态规划晋级——POJ 3254 Corn Fields【状压DP】

    转载请注明出处:http://blog.csdn.net/a1dark 分析:刚开始学状压DP比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...

  9. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

随机推荐

  1. [Windows Server 2008] 查看ASP.net详细错误信息

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:查看IIS ...

  2. Cuder - 用C++11封装的CUDA类

    以前写cuda:初始化环境,申请显存,初始化显存,launch kernel,拷贝数据,释放显存.一个页面大部分都是这些繁杂但又必须的操作,有时还会忘掉释放部分显存. 今天用C++11封装了这些CUD ...

  3. ABP生成错误:必须添加对程序集“netstandard”的引用

    当前使用ABP版本为:4.6.0 升级vs2017到15.4版本,升级framework到4.7版本 如果Core版本请升级到net core 2

  4. ffmpeg从内存读取文件

    正常情况,ffmpeg直接从文件读取 AVFormatContext * _ctx = NULL; avformat_open_input(&_ctx, _filePath, 0, 0); 我 ...

  5. nodejs 文件操作模块 fs

    const fs=require("fs"); //文件操作 //创建目录 ./ 代表当前目录 ../ 代表上级目录fs.mkdir('./test',function(err){ ...

  6. BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列

    Code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  7. php第十九节课

    JQUERY <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  8. 44.bucket filter:统计各品牌最近一个月的平均价格

    课程大纲     GET /tvs/sales/_search { "size": 0, "query": { "term": { &quo ...

  9. web开发如何使用百度地图API(一)判断点是否在范围内

    准备工作 注册开发者 创建应用 拿到百度地图ak 前端实现方案 引入百度地图API和工具类库 <script type="text/javascript" src=" ...

  10. C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List

    C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...