CDOJ 1321 区间DP 解题报告
来源:互联网 发布:mac充电在哪 编辑:程序博客网 时间:2024/05/21 06:51
括号匹配 (parenthesis.pas/cpp/c)
【题目描述】
给出长度为N的括号序列(只包含(,),[,]),问有多少种方法删掉这些括号的一个子集,使得剩下的括号序列是合法的,请注意不能全部删完。
【输入格式】
输入的第一行是一个整数N,表示序列的长度。
接下来一行N个字符,表示括号序列。
【输出格式】
一行,表示方案数模1000000007的结果。
【样例输入】
4
()[]
【样例输出】
3
【数据范围】
30%的数据保证:1 <= N <= 20。
100%的数据保证:1 <= N <= 300。
【解题报告】
考虑用动态规划来统计方案数。
不妨有dp(l,r)表示只考虑(l,r)区间的括号序列,最终合法的方案数(允许删空)
转移显然只有两种决策,第l个括号不进行匹配(删除),转移到dp(l+1,r),和第l个括号进行匹配,
直接进行暴力枚举匹配即可。
复杂度O(n3)
代码如下:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 310#define mod 1000000007#define LL long longint n;char s[N];LL dp[N][N];bool match(int l,int r){ return (s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']');}LL dfs(int l,int r){ if(~dp[l][r]) return dp[l][r]; LL &ans=dp[l][r]=0; if(l>=r) return ans=1; ans=dfs(l+1,r)%mod; for(int i=l+1;i<=r;i++) { if(match(l,i)) { ans+=dfs(l+1,i-1)*dfs(i+1,r); ans%=mod; } } return ans%mod;}int main(){ freopen("parenthesis.in","r",stdin); freopen("parenthesis.out","w",stdout); scanf("%d%s",&n,s); memset(dp,-1,sizeof(dp)); printf("%I64d",(dfs(0,n-1)-1)%mod); return 0;}
阅读全文
0 0
- CDOJ 1321 区间DP 解题报告
- cdoj 1131 区间dp
- CodeVS 3657 区间DP 解题报告
- CodeVS3657 括号序列 解题报告【区间DP】
- CDOJ 1321柱爷的恋爱 (区间dp)
- Cdoj 24点游戏之解题报告
- POJ1651 Multiplication Puzzle ACM解题报告(区间dp)
- POJ 1260 Pearls ACM解题报告(区间dp)
- lightoj-1422 - Halloween Costumes 解题报告 区间dp
- CodeVS2102 石子归并 2 解题报告【区间DP】
- BZOJ 1068 [SCOI 2007] 区间DP 解题报告
- BZOJ 1694 & 1742 [Usaco 2005 nov] 区间DP 解题报告
- codevs 1966 乘法游戏 区间DP 解题报告
- hdu 4283 You Are the One 区间DP 解题报告
- CodeVS 1090 [NOIP 2003] 区间DP 解题报告
- 【cdoj 1321】柱爷的恋爱 区间dp记忆化搜索
- 【DP】2479解题报告
- HDU1864解题报告-dp
- js笔记
- ionic的安装
- win7系统中使用anaconda安装tensorflow,keras
- 【python】Python速成(三) --高级特性
- UVa11437
- CDOJ 1321 区间DP 解题报告
- ETL的过程原理和数据仓库建设
- Eclipse输入Java和XML代码自动提示功能最简单的方法
- Linux中对用户以及用户权力的管理
- nodejs log4js
- 性能测试:有线网络与无线网络的对比
- HDU3255 Farming(线段树+扫描线+体积并)
- hive0.13的搭建配置
- 错排&放苹果