题意:

  有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)的更多相关文章

  1. Codeforces 372B Counting Rectangles is Fun:dp套dp

    题目链接:http://codeforces.com/problemset/problem/372/B 题意: 给你一个n*m的01矩阵(1 <= n,m <= 40). 然后有t组询问( ...

  2. bzoj 3864: Hero meet devil [dp套dp]

    3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...

  3. [模板] dp套dp && bzoj5336: [TJOI2018]party

    Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...

  4. luogu 4158 粉刷匠 dp套dp

    dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...

  5. DP套DP

    DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...

  6. 【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 ...

  7. dp 套 dp扯谈

    1.[扯谈概念] \(dp\) 套 \(dp\) 其实也就是 \(dp\) . 这里就定义下面两个概念: 内层 \(dp\) 表示的是被套在里面的那个 \(dp\) 外层 \(dp\) 表示的是最外面 ...

  8. P4590-[TJOI2018]游园会【dp套dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为\(m\)的字符串\(s\). 对于每个\(k\in[0,m]\)求有多少个长度为 ...

  9. 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)

    洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\)​​​​​.我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...

随机推荐

  1. LeetCode(152) Maximum Product Subarray

    题目 Find the contiguous subarray within an array (containing at least one number) which has the large ...

  2. 关于mysql中select出数据未排序问题

    来自  mysql必知必会

  3. 安装adb工包

    下载android sdk (很大) 从D:\AndroidSdk\platform-tools目录可以看到: 将adb工具包: adb.exe,AdbWinapi.dll,AdbWinUSBapi. ...

  4. oracle主键自增长

    这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create table simon_example ( id number(4) not null primary key, nam ...

  5. 用Navicat Premium快速查看mysql数据库版本信息

    在出现的界面输入命令  select version();

  6. hdu 2665 划分树模板题(可作为模板)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. 自己的Qt GUI 项目+vs2013+opencv+caffe环境配置

    由于深度学习的种种优势,使我们对于深度学习的使用越来越频繁.很多时候,我们都需要在自己的项目中配置caffe环境,来调用caffe网络模型完成自己的任务.今天我主要讲的关于"在自己的项目中配 ...

  8. kb-07专题--线段树-01-单点修改,区间查和

    给定区间长度,然后给两个操作,单点增加值和单点减值,询问一个区间的人数和:(水) 代码如下: /* 写的第一个线段树,丑: */ #include<iostream> #include&l ...

  9. 关于ida pro的插件keypatch

    关于ida pro的插件keypatch 来源 https://blog.csdn.net/fjh658/article/details/52268907 关于ida pro的牛逼插件keypatch ...

  10. [BZOJ3817]Sum

    [BZOJ3817]Sum 试题描述 给定正整数N,R.求 输入 第一行一个数 T,表示有 T 组测试数据. 接下来 T 行,每行两个正整数 n,r. 输出 输出 T 行,每行一个整数表示答案. 输入 ...