codeforces 979E(dp套dp)
题意:
有n个点,编号为1~n。有的点颜色是黑色,有的点颜色是白色,有的点的颜色待涂。你还可以连一些边,但这些边一定是从小编号连到大编号的点。
对于一个确定的图,我们去统计有多少条路径满足“该路径经过的所有点的颜色都是黑白相间的”,如果这种路径总数的奇偶性为p(p是输入的,p=0或1),那么该图就被称为好图
我们需要统计所有图中,好图的个数。答案对1e9+7取模。
分析:
我们先考虑对于一个给定的图,如何求出这种路径的总数
dp[i][0]表示点i是黑点,以点i为终点的所有路径的条数;dp[i][1]表示点i是白点,以点i为终点的所有路径的条数
那么只需要从前往后dp一下就能求出结果了
注意我们只关系奇偶性,所以是在模2意义下,那么dp值只有0和1两种取值
那么有一种显然的dp套dp的思路:f[i][S]表示已经做完了前i个点,前i个点的dp值是S情况下的图的个数
但是最多有50个点,状态是2^50,这样不能解决
仔细分析后发现,我们关心的并不是前i-1个点的具体dp值,我们关心的只是dp[j][0]=0、dp[j][0]=1、dp[j][1]=0、dp[j][1]=1的状态的分别的数目!
于是dp[i][ew][ow][eb][ob]表示前i个点,有ew个even-white点(即以某白点为终点的路径总数是偶数,后面同理),有ow个odd-white点,有eb个even-black点,有ob个odd-black点的情况下,图的个数
那么最后答案就是满足(ow+ob)%2==p的状态的图的个数的总和
这样复杂度是O(n^5),我们考虑优化一下
首先很明显,ob=i-ew-ow-eb,于是可以省掉一个维的状态,复杂度就变成O(n^4)了,可以通过
再进一步,我们发现偶点是随便连的,于是我们只需要记状态为dp[i][ow][ob]就行了,时间复杂度O(n^3)
#include<bits/stdc++.h>
using namespace std;
const int maxn=,mod=1e9+;
int dp[maxn+][maxn+][maxn+][maxn+];
int c[maxn+];
int n,p;
int pw[maxn+];
void inc(int&a,int b)
{
a=(a+b)%mod;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=;i<=n;++i) scanf("%d",&c[i]);
pw[]=;
for(int i=;i<=maxn;++i) pw[i]=pw[i-]*2LL%mod;
if(c[]==||c[]==-) dp[][][][]=;
if(c[]==||c[]==-) dp[][][][]=;
for(int i=;i<=n;++i)
for(int ew=;ew<=i;++ew)
for(int ow=;ow<=i;++ow)
for(int eb=;eb<=i;++eb)
{
if(ow+ew+eb>i) continue;
int ob=i-ew-ow-eb;
if(c[i]==||c[i]==-)
{
if(ow+ew!=)
{
long long s=;
if(ow>=)
if(ob==) s=dp[i-][ew][ow-][eb];
else s=1LL*pw[ob-]*dp[i-][ew][ow-][eb]%mod;
if(ew>=)
if(ob>=) s+=1LL*pw[ob-]*dp[i-][ew-][ow][eb]%mod;
s%=mod;
s=s*pw[eb+ew+ow-]%mod;
inc(dp[i][ew][ow][eb],(int)s);
}
}
if(c[i]==||c[i]==-)
{
if(ob+eb!=){
long long s=;
if(ob>=)
if(ow==) s=dp[i-][ew][ow][eb];
else s=1LL*pw[ow-]*dp[i-][ew][ow][eb]%mod;
if(eb>=)
if(ow>=) s+=1LL*pw[ow-]*dp[i-][ew][ow][eb-]%mod;
s%=mod;
s=s*pw[eb+ob+ew-]%mod;
inc(dp[i][ew][ow][eb],(int)s);
}
}
}
int ans=;
for(int ew=;ew<=n;++ew)
for(int ow=;ow<=n;++ow)
for(int eb=;eb<=n;++eb)
if(ew+ow+eb<=n)
if((ow+n-ew-ow-eb)%==p)
inc(ans,dp[n][ew][ow][eb]);
printf("%d\n",ans);
return ;
}
codeforces 979E(dp套dp)的更多相关文章
- Codeforces 372B Counting Rectangles is Fun:dp套dp
		
题目链接:http://codeforces.com/problemset/problem/372/B 题意: 给你一个n*m的01矩阵(1 <= n,m <= 40). 然后有t组询问( ...
 - bzoj 3864: Hero meet devil [dp套dp]
		
3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...
 - [模板] dp套dp && bzoj5336: [TJOI2018]party
		
Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...
 - luogu 4158 粉刷匠 dp套dp
		
dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...
 - DP套DP
		
DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...
 - 【BZOJ3864】Hero meet devil DP套DP
		
[BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil ...
 - dp 套 dp扯谈
		
1.[扯谈概念] \(dp\) 套 \(dp\) 其实也就是 \(dp\) . 这里就定义下面两个概念: 内层 \(dp\) 表示的是被套在里面的那个 \(dp\) 外层 \(dp\) 表示的是最外面 ...
 - P4590-[TJOI2018]游园会【dp套dp】
		
正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为\(m\)的字符串\(s\). 对于每个\(k\in[0,m]\)求有多少个长度为 ...
 - 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)
		
洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\).我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...
 
随机推荐
- python字符串、列表和字典的说明
			
python字符串.列表和字典的说明 字符串.列表.字典 字符串的作用存储一段数据信息.例如 info = '我爱北京天安门' ,在调取的时候可以直接调取,灵活方便,print(info) 就可以把刚 ...
 - CF 219 D:Choosing Capital for Treeland(树形dp)
			
D. Choosing Capital for Treeland 链接:http://codeforces.com/problemset/problem/219/D The country Tre ...
 - springboot-vue-自定义注解限制接口调用
			
新建注解: /** * 想要权限拦截的接口就加上这个注解 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Doc ...
 - MIME类型-服务端验证上传文件的类型
			
MIME的作用 : 使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件. web服务器使用MIME来说明发送数据的种类, ...
 - webdriver高级应用- 高亮显示正在操作的页面元素
			
#encoding=utf-8 import unittest from selenium import webdriver import time def highLightElement(driv ...
 - day01_05.数学运算符
			
数学运算符 $zhang = 100; $lisi = 50; echo $zhang+$lisi; 答案:150 $zhang = 50; $lisi = 40; echo $zhang - $li ...
 - Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2)
			
A. Splits time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...
 - TOJ1698: Balanced Lineup
			
Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same ...
 - js只能输入汉字
			
var reg = new RegExp("[\\u4E00-\\u9FFF]+","g"); if(reg.test(val)){ al ...
 - 【bzoj2561】最小生成树  网络流最小割
			
题目描述 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最 ...