[CDOJ1321]-区间DP(记忆化搜索)
2017-10-17 19:38
323 查看
说在前面
其实有些地方还想的不是很明白但是还是先把自己懂的写下来,免得以后就忘了…
题目
给出长度为N的括号序列。该序列中只包含()和[]四种字符。询问有多少种方法删掉这些括号的一个子集,使得剩下的括号序列是合法的,请注意不能完全删完。输入
输入的第一行是一个整数N,表示序列的长度。接下来一行N个字符,表示括号序列。
输出
一行,表示方案数模(1e9+7)之后的结果。样例
simple in:4
()[]
simple out:
3
解法
维护dp[i][j]表示在区间[ i , j ]内合法的方案数有多少。小区间答案计算大区间答案。
对于区间[ L , R ],更新分两种情况:
第一种是位置在L的括号被删去后的方案数,即dp[L][R] += dp[L+1][R]。
第二种是位置在L的括号被保留的方案数,被保留那么该括号一定要能与后面的某个括号匹配(假设匹配位置为K),并且匹配之后的其余部分也要合法,[L+1,K-1]和[K+1,R]要合法。由乘法原理,即dp[L][R] += dp[L+1][K-1]*dp[K+1][R]。
对于边界情况,一旦L>=R,全部删去才合法,这种情况只有一种方案。即dp[L][R]=1。
由于题目说了不能全部删完,因此最后答案就是dp[1]
-1。
但我很迷啊!为什么是考虑L位置的括号不匹配而不是R位置的括号不匹配(dp[L][R] = dp[L][R-1])呢….这样的话相当于把方程全部反过来,考虑R位置的和前面的括号是否匹配应该也能对吧…?还没有尝试过
自带大常数的代码
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; int N , mmod = 1e9 + 7 ; long long dp[305][305] ; char ss[305] ; long long solve( int L , int R ){ if( L >= R ) return 1 ; if( dp[L][R] != -1 ) return dp[L][R] ; dp[L][R] = solve( L + 1 , R ) ; char aim = 0 ; if( ss[L] == '(' ) aim = ')' ; if( ss[L] == '[' ) aim = ']' ; if( aim == 0 ) return dp[L][R] ; for( int i = L + 1 ; i <= R ; i ++ ) if( ss[i] == aim ) dp[L][R] = ( dp[L][R] + solve( L+1 , i-1 ) * solve( i+1 , R ) )%mmod ; return dp[L][R] ; } int main(){ freopen( "parenthesis.in" , "r" , stdin ) ; freopen( "parenthesis.out", "w" , stdout) ; scanf( "%d" , &N ) ; scanf( "%s" , ss + 1 ) ; for( int i = 0 ; i <= N ; i ++ ) for( int j = 0 ; j <= N ; j ++ ) dp[i][j] = -1 ; printf( "%I64d" , solve( 1 , N ) - 1 ) ; return 0 ; }
相关文章推荐
- CDOJ 1321 区间DP 解题报告
- Codeforces 509F Progress Monitoring (区间dp 或 记忆化搜索)
- 区间dp||记忆化搜索 Game of Sum UVA - 10891 or Light OJ 1031---Easy Game(区间DP)
- 149D - Coloring Brackets(区间DP 记忆化搜索)
- 【cdoj 1321】柱爷的恋爱 区间dp记忆化搜索
- cdoj 1131 男神的礼物 区间dp
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
- hdu 4597 Play Game (记忆化搜索 区间dp)
- UVA 1630 Folding——区间DP(记忆化搜索)
- UVA1351-----String Compression-----区间DP(记忆化搜索实现)
- HDOJ 2476 - String painter 不是所有的区间DP都方便用记忆化搜索..
- 区间DP(可以看成记忆化搜索)
- cdoj 1131 男神的礼物 区间dp
- UVA 1331 Minimax Triangulation 最大面积最小的三角剖分(区间dp--记忆化搜索)
- HDU3427 Clickomania【记忆化搜索】【区间DP】
- HDU4571-区间DP,记忆化搜索,递推
- HDU 5900 QSC and Master (区间DP 记忆化搜索)
- POJ 2955 Brackets(区间DP, 记忆化搜索)
- cdoj 1131 男神的礼物 区间dp
- Post office (区间dp 记忆化搜索) http://acm.zzuli.edu.cn/problem.php?id=1468