• Link with Bracket Sequence I(状态基多维dp)


    "蔚来杯"2022牛客暑期多校训练营2

    Problem

    给定一个长度为n的括号序列a,问:构成长度为m( n ≤ m n \leq m nm)的合法括号序列b有多少种方案。

    Solution

    f [ i ] [ j ] [ k ] : 表示长度为 i 的序列 b 包含 a 的前 j 个,且还有 k 个左括号还没有匹配的方案数 f[i][j][k]:表示长度为i的序列b包含a的前j个,且还有k个左括号还没有匹配的方案数 f[i][j][k]:表示长度为i的序列b包含a的前j个,且还有k个左括号还没有匹配的方案数

    • a [ j ] =   ′ ( ′ a[j] = ~'(' a[j]= (
      b [ i ] =   ′ ( ′      f [ i − 1 ] [ j − 1 ] [ k − 1 ] → f [ i ] [ j ] [ k ] b[i] = ~'('~~~~f[i - 1][j - 1][k - 1] \to f[i][j][k] b[i]= (    f[i1][j1][k1]f[i][j][k]
      b [ i ] =   ′ ) ′      f [ i − 1 ] [ j ] [ k + 1 ] → f [ i ] [ j ] [ k ] b[i] = ~')'~~~~f[i - 1][j][k + 1] \to f[i][j][k] b[i]= )    f[i1][j][k+1]f[i][j][k]
    • a [ j ] =   ′ ) ′ a[j] = ~')' a[j]= )
      b [ i ] =   ′ ( ′      f [ i − 1 ] [ j ] [ k − 1 ] → f [ i ] [ j ] [ k ] b[i] = ~'('~~~~f[i - 1][j][k - 1] \to f[i][j][k] b[i]= (    f[i1][j][k1]f[i][j][k]
      b [ i ] =   ′ ) ′      f [ i − 1 ] [ j − 1 ] [ k + 1 ] → f [ i ] [ j ] [ k ] b[i] = ~')'~~~~f[i - 1][j - 1][k + 1] \to f[i][j][k] b[i]= )    f[i1][j1][k+1]f[i][j][k]

    Code

    int n, m;
    ll f[202][202][202];
    
    int main()
    {
    	IOS;
    	int T; cin >> T;
    	while (T--)
    	{
    		cin >> n >> m;
    		string s; cin >> s;
    		s = " " + s;
    
    		f[0][0][0] = 1;
    		for(int i = 1; i <= m; i++)
    			for(int j = 0; j <= min(i, n); j++)
    				for (int k = 0; k <= i; k++)
    				{
    					f[i][j][k] = 0;
    					if (j == 0)
    					{
    						if(k) f[i][j][k] += f[i - 1][j][k - 1];//第i位为左括号
    						f[i][j][k] += f[i - 1][j][k + 1];//第i位为右括号
    					}
    					else if (s[j] == '(')
    					{
    						if(j && k) f[i][j][k] += f[i - 1][j - 1][k - 1];//第i位为左括号
    						f[i][j][k] += f[i - 1][j][k + 1];//第i位为右括号
    					}
    					else
    					{
    						if(k) f[i][j][k] += f[i - 1][j][k - 1];//第i位为左括号
    						if(j) f[i][j][k] += f[i - 1][j - 1][k + 1];//第i位为右括号
    					}
    					f[i][j][k] %= mod;
    				}
    
    		cout << f[m][n][0] << endl;
    	}
    
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    【C语言从入门到放弃 6】递归,强制类型转换,可变参数和错误处理详解
    vscode自定义代码提示
    Rust Rocket简单入门
    2022年 6 月面试题 100 + 大全(合适各级 Java 人员)
    俄罗斯网络间谍组织在有针对性的攻击中部署LitterDrifter USB蠕虫
    1.7.4、计算机网络体系结构中的术语
    单链表的排序问题
    文本格式清理工具 TextSoap mac中文版软件特色
    【wpf】自定义事件总结(Action, EventHandler)
    最短路径Dijkstra算法详解
  • 原文地址:https://blog.csdn.net/QQ2530063577/article/details/126020190