题意:有一个字符串 s. 这个字符串是一个完全匹配的括号序列.在这个完全匹配的括号序列里,每个括号都有一个和它匹配的括号

你现在可以给这个匹配的括号序列中的括号染色,且有三个要求:

每个括号只有三种情况,不上色,上红色,上蓝色.

每对括号必须只能给其中的一个上色,且必须给一个上色

相邻的两个不能上同色,可以都不上色

求满足条件的括号序列染色的方法数

假设不染色为0,另外两种色为1,2

那对于一个匹配的括号对来说,只允许(1,0),(2,0),(0,1),(0,2)

定义\(f[l][r][i][j]\):区间\([l,r]\)的左端点状态为\(i\),右端点状态为\(j\)时的当前区间方案数

可以得出当\(l+1=r\)时,只有上述四种存在方案数1

除此以外还有两种情况

1.当前处理区间\([l,r]\)两端点恰好是一个匹配括号对

2.当前处理区间\([l,r]\)两端点不是一个匹配括号对

情况1可以先递归处理\([l+1,r-1]\)的方案,最后合并方案数,这里要注意相邻位置不可取同等颜色

情况2也可分治\([l,match[l]]\)(情况1)和\([match[l]+1,r]\)两个区间处理.方案数是两个区间合法方案的乘积,同样要注意约束条件

具体的操作看代码

  1. #include<bits/stdc++.h>
  2. #define rep(i,j,k) for(int i=j;i<=k;i++)
  3. #define rrep(i,j,k) for(int i=j;i>=k;i--)
  4. #define println(a) printf("%lld\n",(ll)(a))
  5. #define printbk(a) printf("%lld ",(ll)(a))
  6. typedef long long ll;
  7. using namespace std;
  8. const int MAXN = 732+11;
  9. const ll oo = 0x3f3f3f3f3f3f3f3f;
  10. const ll ooo= 0x3f3f3f3f;
  11. const int MOD = 1e9+7;
  12. ll read(){
  13. ll x=0,f=1;register char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  16. return x*f;
  17. }
  18. ll dp[MAXN][MAXN][3][3];
  19. int match[MAXN];
  20. char str[MAXN];
  21. void DP(int l,int r){
  22. if(l==r){
  23. rep(i,0,2) rep(j,0,2) dp[l][r][i][j]=0;
  24. return;
  25. }
  26. if(l+1==r){
  27. dp[l][r][0][0]=0;
  28. dp[l][r][1][1]=0;
  29. dp[l][r][2][2]=0;
  30. dp[l][r][1][2]=0;
  31. dp[l][r][2][1]=0;
  32. dp[l][r][1][0]=1;
  33. dp[l][r][0][1]=1;
  34. dp[l][r][2][0]=1;
  35. dp[l][r][0][2]=1;
  36. }else if(match[l]==r){
  37. DP(l+1,r-1);
  38. rep(i,0,2) rep(j,0,2) dp[l][r][i][j]=0;
  39. rep(i,0,2) rep(j,0,2){ // i==j ok/ err 0
  40. if(j!=1) dp[l][r][0][1]+=dp[l+1][r-1][i][j];
  41. if(j!=2) dp[l][r][0][2]+=dp[l+1][r-1][i][j];
  42. if(i!=1) dp[l][r][1][0]+=dp[l+1][r-1][i][j];
  43. if(i!=2) dp[l][r][2][0]+=dp[l+1][r-1][i][j];
  44. rep(x,0,2) rep(y,0,2){
  45. if(dp[l][r][x][y]>=MOD) dp[l][r][x][y]%=MOD;
  46. }
  47. }
  48. }else{
  49. DP(l,match[l]); DP(match[l]+1,r);
  50. rep(i,0,2) rep(j,0,2) dp[l][r][i][j]=0;
  51. rep(i,0,2) rep(j,0,2) rep(x,0,2) rep(y,0,2)if((x==y&&x==0)||(x!=y)){
  52. dp[l][r][i][j]+=dp[l][match[l]][i][x]*dp[match[l]+1][r][y][j]%MOD;
  53. if(dp[l][r][i][j]>=MOD) dp[l][r][i][j]%=MOD;
  54. }
  55. }
  56. }
  57. int main(){
  58. while(~scanf("%s",str+1)){
  59. memset(dp,-1,sizeof dp);
  60. stack<int> stk;
  61. int n=strlen(str+1);
  62. rep(i,1,n){
  63. if(str[i]=='(') stk.push(i);
  64. else{
  65. int pos=stk.top();stk.pop();
  66. match[pos]=i;
  67. }
  68. }
  69. DP(1,n);
  70. ll res=0;
  71. rep(i,0,2) rep(j,0,2) res=(res+dp[1][n][i][j])%MOD;
  72. println(res);
  73. }
  74. return 0;
  75. }

Codeforces - 1025D

题意:给出n个节点的值\(a_i\),若两节点的值gcd不为1则可连边,问这n个点能否构成一个二叉树

//压根没想到是区间DP

\(L[l][r]\):以\(r\)为根,\([l,r-1]\)能否构成左子树

\(R[l][r]\):以\(l\)为根,\([l+1,r]\)能否构成右子树

\(ok[l][r]\):\([l,r]\)能否构成二叉树

用区间DP的方法不断扩展l,r可行范围即可

具体画个图很容易看出来左右的扩展方式

https://paste.ubuntu.com/p/VdBdSjMYYR/


598E

题意:一个大小为n*m的巧克力,要分出面积k的巧克力(可以拼凑出来),每次操作只能横着掰开或竖着掰开,代价为掰开的边长的平方,求最小代价

思绪良久,还是\(O(n^5)\)暴力出所有情况

https://paste.ubuntu.com/p/7QJcxg8SFc/


245H

题意:求出所有\([L,R]\)的回文子串个数

容斥定理,对于\([L,R]\)内的贡献,来自于\([L,R-1]\)和\([L+1,R]\),重复贡献为\([L+1,R-1]\)

如果\(str_L=str_R\)且内部为回文串,那么贡献要+1(SB如我又加了一遍[L+1,R-1])

https://paste.ubuntu.com/p/4S35zpYzRz/


159D

题意:求\(s[a,b]\) && \(s[x,y]\)的回文子串对的个数,\(1≤a≤b<x≤y≤n\)

感觉和前面的题目很相似,但答案并非\(dp[1][i]*dp[i+1][n]\),这样存在重复贡献

因此引入一个\(g[i]\):以\(i\)结尾的回文串个数

这样就可以\(g[i]*dp[i+1][n]\)不重不漏地求出所有数量

https://paste.ubuntu.com/p/5TjgK8kX6R/


Gym - 101196F

题意:给出一个\(a[1...n]\)的环,n接回1,环中每删除一个数的代价是数两旁元素的gcd值,求最小删除代价

\(dp[i][j]\):\([i,j]\)区间只剩\(i\)和\(j\)的最小代价

然后xjb乱写居然过了?

https://paste.ubuntu.com/p/k25HZxxcCQ/

Codeforces - 149D 不错的区间DP的更多相关文章

  1. codeforces 149D Coloring Brackets (区间DP + dfs)

    题目链接: codeforces 149D Coloring Brackets 题目描述: 给一个合法的括号串,然后问这串括号有多少种涂色方案,当然啦!涂色是有限制的. 1,每个括号只有三种选择:涂红 ...

  2. CodeForces 149D Coloring Brackets 区间DP

    http://codeforces.com/problemset/problem/149/D 题意: 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2 ...

  3. codeforce 149D Coloring Brackets 区间DP

    题目链接:http://codeforces.com/problemset/problem/149/D 继续区间DP啊.... 思路: 定义dp[l][r][c1][c2]表示对于区间(l,r)来说, ...

  4. CF 149D Coloring Brackets 区间dp ****

    给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2.每对括号必须只能给其中的一个上色 3.相邻的两个不能上同色,可以都不上色 求0-len-1这一区间内 ...

  5. Codeforces.392E.Deleting Substrings(区间DP)

    题目链接 \(Description\) \(Solution\) 合法的子序列只有三种情况:递增,递减,前半部分递增然后一直递减(下去了就不会再上去了)(当然还要都满足\(|a_{i+1}-a_i| ...

  6. Codeforces 983B. XOR-pyramid【区间DP】

    LINK 定义了一种函数f 对于一个数组b 当长度是1的时候是本身 否则是用一个新的数组(长度是原数组-1)来记录相邻数的异或,对这个数组求函数f 大概是这样的: \(f(b[1]⊕b[2],b[2] ...

  7. CodeForces - 1025D: Recovering BST (区间DP)

    Dima the hamster enjoys nibbling different things: cages, sticks, bad problemsetters and even trees! ...

  8. Codeforces 1114D Flood Fill (区间DP or 最长公共子序列)

    题意:给你n个颜色块,颜色相同并且相邻的颜色块是互相连通的(连通块).你可以改变其中的某个颜色块的颜色,不过每次改变会把它所在的连通块的颜色也改变,问最少需要多少次操作,使得n个颜色块的颜色相同. 例 ...

  9. Codeforces 958C3 - Encryption (hard) 区间dp+抽屉原理

    转自:http://www.cnblogs.com/widsom/p/8863005.html 题目大意: 比起Encryption 中级版,把n的范围扩大到 500000,k,p范围都在100以内, ...

随机推荐

  1. 状态模式c#(状态流转例子吃饭)

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace 状态模式{   ...

  2. jquery的理解

    1.jquery的好处 简化js的复杂操作 不再需要关心兼容性 提供大量使用方法 2.jquery的设计思想 选择网页元素 -模拟css选择元素 -独有的表达式选择 -多种筛选方法 写法 -方法函数化 ...

  3. 获取iOS设备唯一标识

    [获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在 ...

  4. ZSTU4274 约素 2017-03-22 17:11 66人阅读 评论(0) 收藏

    4274: 约素 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1807  Solved: 467 Description 判断一个正整数n的约数个数 ...

  5. VS2010中如何将动态链接库改成静态链接库

    VS2010中如何将动态链接库改成静态链接库 VS2010静态编译生成的.exe可执行文件,可以免安装免DLL在其他电脑直接运行. 静态编译:就是在编译可执行文件的时候,将可执行文件需要调用的对应动态 ...

  6. 通过HttpClient请求webService

    通过HttpClient请求webService 由于服务端是用webService开发的,android要调用webService服务获取数据,这里采用的是通过HttpClient发送post请求, ...

  7. Rhino 使 JavaScript 应用程序更灵动(转载)

    脚本语言有良好的快速开发,高效率的执行,解释而非编译执行等优点,并且具有与其他语言编写的组件之间强大的通信功能.JavaScript 一直是脚本语言中的领头羊,它是一门具有非常丰富特性的语言.除了浏览 ...

  8. Centos 7 安装 mysql5.7

    1.需要下载mysql 下载地址:http://dev.mysql.com/downloads/mysql/ 2.将下载的rpm包上传到centos 7上(我是放在根下面的opt目录) 3. 安装my ...

  9. (轉載)sql server xml字段的操作

    原文轉自:http://blog.csdn.net/hliq5399/article/details/8315373 另外可參考:https://msdn.microsoft.com/en-us/li ...

  10. ADB server didn't ACK问题,连上手机问题(转)

    出现如下情况 ADB server didn't ACK* failed to start daemon * 解决办法: 方法一: (1)查看任务管理器,关闭所有adb.exe,或者运行->cm ...