【HDOJ5555】Immortality of Frog(状压DP)
题意:给你一个NxN的网格,第N行的每一列都有个青蛙,这些青蛙只会往上走,
上帝会在每个膜中随机等概率放一个长生不老的药,
一共有N个膜,每个膜覆盖一些区间,如果这个区间恰好为N那么就是好膜,否则是坏膜,每个青蛙最多只能穿过10个坏膜,
问全部青蛙吃到药,并全部到顶层的概率*∏Ni=1(Ri−Li+1)
n<=1e3,1<=l[i]<=r[i]<=n
思路:经过思考可以发现其实就是让你求每只蛙都有且仅有配对到一个膜的方案数
From https://blog.csdn.net/bin_gege/article/details/51889815
1.我们首先统计每一列有多少个坏膜,其中一列如果大于10,那么青蛙肯定不能全部到达顶部,ans=0;
2.假设青蛙把全部的坏膜吃完了,当前的方案数为p,好膜是都可以吃的,那么此时的答案就是好膜的个数的阶乘*p。
3.这时我们就该来算全部吃完坏膜的方案数了。
4.首先每一列最多只有10个坏膜,那么我们可以用状态压缩来保存每一列坏膜的状态,记录每一列坏膜的相对位置,对于每一次转移处理出对于新的一行的状态
第一次用vector,需要注意vector从0开始编号,当vector为空时因为size是一个unsigned int,-1会出现越界的问题,所以每次都需要强制类型转换成int
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector> typedef long long ll;
using namespace std;
#define N 1100
#define oo 10000000
#define MOD 105225319 int dp[N][N],l[N],r[N],fac[N],p1[N],p2[N],n;
vector<int>c[N]; void add(int &x,int y)
{
x+=y;
if(x>=MOD) x-=MOD;
} void calc(int k)
{
for(int i=;i<=(int)c[k].size()-;i++)
{
p1[i]=-;
for(int j=;j<=(int)c[k+].size()-;j++)
if(c[k][i]==c[k+][j]){p1[i]=j; break;}
}
for(int i=;i<=(int)c[k+].size()-;i++)
{
p2[i]=-;
for(int j=;j<=(int)c[k].size()-;j++)
if(c[k+][i]==c[k][j]){p2[i]=j; break;}
}
} int turn(int x,int y)
{
int t=;
for(int i=;i<=(int)c[x].size()-;i++)
{
if(p1[i]==-)
{
if(!((y>>i)&)) return -;
}
else if(y>>i&) t|=(<<p1[i]);
}
return t;
} int main()
{
fac[]=;
for(int i=;i<N;i++) fac[i]=(ll)fac[i-]*i%MOD;
int cas;
scanf("%d",&cas);
for(int v=;v<=cas;v++)
{
scanf("%d",&n);
for(int i=;i<=n;i++) c[i].clear();
for(int i=;i<=n;i++) scanf("%d",&l[i]);
for(int i=;i<=n;i++) scanf("%d",&r[i]);
int num=;
for(int i=;i<=n;i++)
{
if(l[i]==&&r[i]==n) num++;
else
for(int j=l[i];j<=r[i];j++) c[j].push_back(i);
} int flag=,ans=;
for(int i=;i<=n;i++)
if(c[i].size()>){flag=; break;}
if(flag)
{
for(int i=;i<=n;i++)
for(int j=;j<=(<<(int)c[i].size());j++) dp[i][j]=;
dp[][]=;
for(int i=;i<=n-;i++)
{
calc(i);
for(int j=;j<=(<<(int)c[i].size())-;j++)
{
int t=turn(i,j);
if(t!=-)
{
//坏膜的数量可能比蛙少,所以可能会出现当前蛙不需要走坏膜的情况
add(dp[i+][t],dp[i][j]);
for(int k=;k<=(int)c[i+].size()-;k++)
if(p2[k]==-||!(t>>k&)) add(dp[i+][t|(<<k)],dp[i][j]);
}
}
}
ans=(ll)fac[num]*dp[n][(<<(int)c[n].size())-]%MOD;
}
printf("Case #%d: %d\n",v,ans);
}
return ;
}
【HDOJ5555】Immortality of Frog(状压DP)的更多相关文章
- hdu_5555_Immortality of Frog(状压DP)
		
题目连接:hdu_5555_Immortality of Frog 题意: 给你一个NxN的网格,第N行的每一列都有个青蛙,这些青蛙只会往上走,上帝会在每个膜中放一个长生不老的药,一共有N个膜,每个膜 ...
 - 【状压DP】【CF8C】 Looking for Order
		
传送门 Description 给你n个点,每次可以从起点到最多两个点然后回到起点.求经过每个点最少一次的最短欧氏距离和是多少 Input 第一行是起点的坐标 第二行是点的个数\(n\) 下面\(n\ ...
 - 【状压DP】【UVA11795】 Mega Man's Mission
		
传送门 Description 你要杀n个怪,每杀掉一个怪那个怪会掉落一种武器,这种武器可以杀死特定的怪.游戏初始你有一把武器,能杀死一些怪物.每次只能杀一只,求有多少种杀怪方法. Input 多组数 ...
 - P3959 宝藏 状压dp
		
之前写了一份此题关于模拟退火的方法,现在来补充一下状压dp的方法. 其实直接在dfs中状压比较好想,而且实现也很简单,但是网上有人说这种方法是错的...并不知道哪错了,但是就不写了,找了一个正解. 正 ...
 - BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
		
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
 - nefu1109 游戏争霸赛(状压dp)
		
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
 - poj3311 TSP经典状压dp(Traveling Saleman Problem)
		
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
 - [NOIP2016]愤怒的小鸟 D2 T3 状压DP
		
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
 - 【BZOJ2073】[POI2004]PRZ 状压DP
		
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
 - bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
		
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
 
随机推荐
- GPIO实现I2C协议模拟(2)
			
接着上一节继续补充 结合上一节的描述 写Slave的过程如下(BYTE) 读Slave的过程如下(BYTE) 分为两段 第一段 ,写OFFSET,第二段读数据 WORD的方式与BYTE大同异 读行为 ...
 - 数据分析处理库Pandas——概述
			
导入Pandas库 创建DataFrame结构 读取.csv文件 titanic_train.csv文件:https://files.cnblogs.com/files/gloria-zhang/ti ...
 - Python学习笔记:math模块(数学),random模块(随机数)
			
math模块 math模块用于数学意义上的一些计算,常用的方法有: math.pi:PI的值(3.141592653589793). math.floor(x):返回一个小于等于x的最大整数(浮点类型 ...
 - python3 爬取汽车之家所有车型数据操作步骤(更新版)
			
题记: 互联网上关于使用python3去爬取汽车之家的汽车数据(主要是汽车基本参数,配置参数,颜色参数,内饰参数)的教程已经非常多了,但大体的方案分两种: 1.解析出汽车之家某个车型的网页,然后正则表 ...
 - javascript隐藏和显示元素以及清空textarea
			
当前希望写一个单选框,选中“paste”则显示粘贴框,选中“upload”则提示选择文件. 因为这两种情况只是显示不同,所以只需要用javascript来进行显示和隐藏. 最后的结果大概这样: 初始时 ...
 - Java8_Lambda表达式
			
从2014年java8发布到现在已经有几个年头了,现在java11都发布了.公司最近把服务器环境重新搭建了一遍,jdk版本也从7换成了8,终于可以在代码里面写Lambda表达式了.作为 ...
 - 03018_监听器Listener
			
1.什么是监听器? (1)监听器就是监听某个对象的状态变化的组件: (2)监听器的相关概念 ①事件源:被监听的对象------三个域对象:request.session.ServletContext ...
 - loj2074 「JSOI2016」灯塔
			
loj 题面错的--去bzoj上看吧qwq 观察到 \(\sqrt{|i-j|}\) 的取值只有 \(\sqrt{n}\) 级别个,然后就很显然了,rmq. #include <iostream ...
 - IOS开发---菜鸟学习之路--(十五)-如何实现拍照功能
			
本章将来讲解下如何实现拍照的功能 我们需要的实现的效果是 好了 直接开始内容吧 首先我们需要新建一个ViewController 就叫AddPictureViewController 然后选 ...
 - 【Climbing Stairs】cpp
			
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...