poj 2288 Islands and Bridges ——状压DP
题目: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的更多相关文章
- poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)
题目:http://poj.org/problem?id=2288 不知为什么记忆化搜索就是WA得不得了! #include<iostream> #include<cstdio> ...
- [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比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...
- POJ 1185 炮兵阵地 【状压DP】
<题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
随机推荐
- 关于类似vue-cli 脚手架
#!/usr/bin/env node const download = require('download-git-repo') const program = require('commander ...
- JS高级——instanceof语法
基本语法 对象 instanceof 构造函数 基本使用 <script> function Person() { } //p--->Person.prototype--->O ...
- HDU_1502_dp
Regular Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 6 个 Linux 运维典型问题,大牛的分析解决思路在这里
作为一名合格的 Linux 运维工程师,一定要有一套清晰.明确的解决故障思路,当问题出现时,才能迅速定位.解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示 ...
- api 签名算法
<?php define('token', 'tokensecret'); // 定义私钥token /** * 哈希验证签名 */ function hmacSign($array, $tok ...
- HDU 1907 John(博弈)
题目 参考了博客:http://blog.csdn.net/akof1314/article/details/4447709 //0 1 -2 //1 1 -1 //0 2 -1 //1 2 -1 / ...
- Linux之FTP/TFTP(vsftp、vsftpd) HTTP(httpd、apache) DHCP(dhcpd)
FTP/TFTP(vsftp.vsftpd): FTP是File Transfer Protocol(文件传输协议)而中文简称为"文传协议".用于Internet上的控制文件的双向 ...
- 【Codeforces 522A】Reposts
[链接] 我是链接,点我呀:) [题意] 有人转载官方号的动态. 又有其他人转载其他人转载的动态. 问你最长的一条转载动态的链有多长. [题解] 用map把每个人的英文都转成小写的 然后从map中获取 ...
- hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)
转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...
- CentOS 5.8 上安装 systemtap-2.6
最近为了分析公司的一个 nginx + lua 的应用性能,正好需要用到春神的那套 nginx-lua 的分析脚本,因此就立马去搭建下 环境: CentOS 5.8 Lua 5.2.3 luajit- ...