题目链接

Codeforces Round #501 (Div. 3) F. Bracket Substring

题解

官方题解

http://codeforces.com/blog/entry/60949 ....看不懂

设dp[i][j][l]表示前i位,左括号-右括号=j,匹配到l了

状态转移,枚举下一个要填的括号,用next数组求状态的l,分别转移

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 207;
const int mod = 1e9 + 7;
char s[maxn];
int next[maxn],dp[maxn][maxn][maxn],n;
void GetNext(int l) {
next[0] = 0;
for(int i = 1; i <= l; i++) {
int p = next[i-1];
while(p > 0 && s[p] != s[i]) p = next[p-1];
next[i] = p + 1;
}
}
int main() {
scanf("%d%s",&n,s + 1);
int len = strlen(s + 1);
GetNext(len);
dp[0][0][0] = 1;
for(int i = 0;i <= 2 * n;++ i)
for(int j = 0;j <= n; ++ j) {
for(int l = 0;l < len;++ l) {
int x = l + 1;
while(x > 0 && s[x] != '(') x = next[x - 1];
dp[i + 1][j + 1][x] = (dp[i + 1][j + 1][x] + dp[i][j][l]) % mod;
x = l + 1;
while(x > 0 && s[x] != ')') x = next[x - 1];
if(j > 0)
dp[i + 1][j - 1][x] = (dp[i + 1][j - 1][x] + dp[i][j][l]) % mod;
}
dp[i + 1][j + 1][len] =(dp[i + 1][j + 1][len] + dp[i][j][len]) % mod;
if(j > 0) dp[i + 1][j - 1][len] = (dp[i][j][len] + dp[i + 1][j - 1][len]) % mod;
}
cout << dp[2 * n][0][len] << endl;
return 0;
}

最新文章

  1. Oracle冷备迁移脚本(文件系统)
  2. VirtualBox注册Com对象失败解决方法
  3. Node.js学习笔记
  4. 教程和工具--用wxPython编写GUI程序的
  5. atitit.导航的实现最佳实践and声明式编程
  6. SpringJUnit4测试--测试无反应/控制台报空指针的解决---junit的jar冲突!
  7. SharePoint 2013 Pop-Up Dialogs
  8. Oracle连接配置以及实例的备份和恢复
  9. .Net SSRS(rdlc) 报表经验总结
  10. 我有DIY一Android遥控-所有开源
  11. Linux搭建SVN服务器(服务端)
  12. L1-Day4
  13. 简述DDOS攻击的工作原理
  14. Doker安装日志,留个记录而已
  15. python解释器遇到if __name__==&quot;__main__&quot;会如何做?
  16. 合作开发工具——freeze和pipreqs
  17. 手把手教你用CAB发布OCX的简单办法
  18. 线程池,queue模块增加用法
  19. Ingress 暴露tcp端口
  20. pyquery学习笔记

热门文章

  1. C语言扫盲篇
  2. 将网页设置为允许 XMLHttpRequest 跨域访问
  3. Linux 静态库与动态库
  4. 20155236 2016-2017-2 《Java程序设计》第八周学习总结
  5. 第10月第1天 iOS crash
  6. Python内置模块与标准库
  7. USB的挂起和唤醒(Suspend and Resume)【转】
  8. Linux 串口、usb转串口驱动分析(2-1) 【转】
  9. jquery.validate动态更改校验规则
  10. php如何优雅地把数组传递给前端js脚本?