HDU 4921 Map DFS+状态压缩+乘法计数
算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数。
对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久,其实因为只能取某个链的前缀,所以直接取链长加+1 然后相乘即可,当然因为会出现都是空的那种情况,要去掉,全部乘完之后,要-1
然后就是算权值了,权值等于当前加进来的点的总和 以及 等级相同的点的加成,并不是特别好算,这时候考虑每个状态下的点对全局的贡献,对,就是这个思想,用状态压缩来表示状态,然后这个状态占用的所有情况,又可以用乘法原理乘出来。然后对这个状态算出权值之后,乘以所有的占用情况即可
下标是从0开始的,注意
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 10010;
int u[N],v[N],ft[N],nt[N];
int ind[N],deep[N],val[N],vis[N];
int n,m,cnt;
vector <int> ve[20];
int dir[20],sz[1100],cur;
void init()
{
for (int i=0;i<=n;i++){
ft[i]=-1;
ind[i]=0;
vis[i]=0;
}
cnt=0;
cur=0;
for (int i=0;i<20;i++){
ve[i].clear();
}
for (int i=0;i<1100;i++) sz[i]=0;
}
void add(int a,int b)
{
u[cnt]=a;
v[cnt]=b;
nt[cnt]=ft[a];
ft[a]=cnt++;
}
void dfs(int x)
{
if (vis[x]) return;
vis[x]=1;
for (int i=ft[x];i!=-1;i=nt[i]){
int vx=v[i];
if (vis[vx]) continue;
ve[cur-1].push_back(vx);
int len=ve[cur-1].size();
sz[len-1]++;
dfs(vx);
}
}
int main()
{
int t,a,b;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
init();
for (int i=0;i<n;i++){
scanf("%d",&val[i]);
}
while (m--)
{
scanf("%d%d",&a,&b);
add(a,b);
ind[b]++;
}
for (int i=0;i<n;i++){
if (vis[i]==0 && ind[i]==0){
dir[cur++]=i;
ve[cur-1].push_back(i);
dfs(i);
sz[0]++;
}
}
double tot=1;
int maxn=0;
for (int i=0;i<cur;i++){
int tmp=ve[i].size();
maxn=tmp>maxn?tmp:maxn;
tot*=(double)(tmp+1);
}
tot-=1;
double ans=0,sum=0;
for (int i=0;i<maxn;i++){
// cout<<"Test "<<i<<endl;
for (int j=1;j<(1<<cur);j++){
//cout<<"sta "<<j<<endl;
sum=0;
int tmp=0;
double calc=1.0;
for (int k=0;k<cur;k++){
int r=ve[k].size();
bool flag=((1<<k)&j);
if (r<=i && flag){
sum=0;
break;
}
if (i<r && flag){
sum+=(double)val[ve[k][i]];
tmp++;
calc*=(double)(r-i);
}
else
{
calc*=(min(r,i)+1)*1.0;
}
}
//cout<<"calc "<<calc<<endl;
//cout<<"sum "<<sum<<endl;
ans+=sum*calc;
if (tmp>1) ans+=calc*(double)tmp/(double)sz[i]*sum;
// cout<<"ans "<<ans<<endl;
}
}
//cout<<"cur "<<cur<<endl;
//cout<<ans<<" "<<tot<<endl;
ans=ans/tot;
printf("%.3lf\n",ans);
}
return 0;
}
HDU 4921 Map DFS+状态压缩+乘法计数的更多相关文章
- HDU 4921 Map(状态压缩)
题意看这篇博客. 思路参考的这篇博客. 补充:面对这种问题有一个常见的套路.比如计算若干个区间对答案的贡献这种问题,直接暴力可能复杂度到O(n ^ 2), 而我们可以计算出每个元素在多少个合法区间中, ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 1198 Farm Irrigation(状态压缩+DFS)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目: Farm Irrigation Time Limit: 2000/1000 MS (Ja ...
- [HDU 4336] Card Collector (状态压缩概率dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题目大意:有n种卡片,需要吃零食收集,打开零食,出现第i种卡片的概率是p[i],也有可能不出现卡 ...
- hdu 3681 Prison Break(状态压缩+bfs)
Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...
- HDU 3001 Travelling(状态压缩DP+三进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...
- HDU 4628 Pieces(状态压缩+记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索 ...
- HDU 4511 (AC自动机+状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2-> ...
- hdu 2825(ac自动机+状态压缩dp)
题意:容易理解... 分析:在做这道题之前我做了hdu 4057,都是同一种类型的题,因为题中给的模式串的个数最多只能为10个,所以我们就很容易想到用状态压缩来做,但是开始的时候我的代码超时了dp时我 ...
随机推荐
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:设置元素为 display:block 并居中显示
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【剑指Offer面试编程题】题目1368:二叉树中和为某一值的路径--九度OJ
题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 输入: 每个测试案例包括n+1行: 第一行为2 ...
- routes 学习
对于routes的学习,感觉还是看官方文档理解的比较快,主要说明connect和resource Setting up routes¶ It is assumed that you are using ...
- Python学习第九课——匿名函数
匿名函数 # 匿名函数 func = lambda x: x + 1 # x表示参数 x+1表示处理逻辑 print(func(10)) # 输出结果为11 # 例:如何将name="han ...
- JS链接转换为二维码
这里用到一个JQ插件 qrcode.js 下载地址https://github.com/jeromeetienne/jquery-qrcode 先引入 <script src="j ...
- 引用类型--Function类型(函数声明与函数表达式、arguments.callee、caller、apply、call、bind)
在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 ...
- lnmp1.5下安装mongodb
一.安装mongodb .下载MongoDB 2.6.0二进制发行版 $ curl -O http://downloads.mongodb.org/linux/mongodb-linux-x86_64 ...
- I2S 总线学习:2-I2S驱动WM8978
背景 为了了解I2S总线所对应的硬件设计,下文转载了<STM32:I2S驱动WM8978>. 以加深对I2S总线的了解. 正文 最近项目中使用STM32F4驱动音频IC:WM8978. 由 ...
- Windows编程常用api
转载网络 黑客常用WIN API函数整理 一.进程 创建进程: CreateProcess (,,,,,,,&si,&pi); WinExec("notepad", ...
- PE文件结构体-IMAGE_OPTIONAL_HEADER
typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // WORD Magic; // 标志字, ROM 映像(0107h), ...