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_ ...
随机推荐
- Python9-网络编程3-day32
解决黏包的问题 #server import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() conn,addr ...
- solr配置中文分词器
配置IK分词器 在/opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF/lib目录中加入IK分词器的jar包 在/opt/solr-7.7.1/serve ...
- LeetCode(217)Contains Duplicate
题目 Given an array of integers, find if the array contains any duplicates. Your function should retur ...
- Linux之crond 服务介绍
在介绍crond之前,先科普一下什么是进程?什么是线程?什么是程序? 程序:程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行.进程则是运行着的程序,是操作系统执行的基本单位.线程则是为了节 ...
- SQL_5_子句
接下来讲到的子句有: WHERE STARTING WITH ORDER BY GROUP BY HAVING WHERE: 使用频率仅次于SELECT和FROM STARTING WITH: 附加于 ...
- 基于TCP协议的网络通讯流程
不多说了,先上个图: 从上面的图中可以看出来,基于TCP协议进行通讯可以大致分成以下几个阶段: 1. 首先是在服务器端, TCP Sever调用socket(), bind(), listen()完成 ...
- Python ORM
本章内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句.如果 ...
- loj2275 「JXOI2017」颜色
枚举右端点,然后看左端点合法情况. 先预处理每个颜色 \(i\) 的最大出现位置 \(max_i\) 和最小出现位置 \(min_i\).对于枚举右端点在一个位置 \(i\),凡是 \(max_k & ...
- sql中group by 和having 用法解析
--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的 ...
- 利用Python分析羊车门问题
题目描述:有3扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么.参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门,露出门后的山羊,然后允许参赛者更换自己的选择. ...