zoukankan      html  css  js  c++  java
  • [JZOJ 5804] 简单的序列

    思路:
    似乎和某次培训的题很像啊。。。
    将左括号记为1,右括号记为-1,那么最终一定加和为0,然后再求最小前缀和。
    用dp解决即可。

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int maxn = 1000010;
    const int mod = 1e9+7;
    char s[maxn];
    int n,m;
    ll sum;
    int mn;
    ll dp[2010][2010];
    ll ans;
    int main () {
    	#ifdef ONLINE_JUDGE
    		freopen("bracket.in","r",stdin);
    		freopen("bracket.out","w",stdout);
    	#endif
    	scanf("%d %d",&n,&m);
    	scanf("%s",s+1);
    	for(int i = 1;i <= m; ++i) {
    		if(i == 1) mn = (s[i] == '(' ? 1 : -1);
    		sum += (s[i] == '(' ? 1 : -1);
    		mn = min(mn,(int)sum);
    	}
    	dp[0][0] = 1;
    	for(int i = 1;i <= n - m; ++i) {
    		for(int j = 0;j <= i; ++j) {
    			if(!j) {
    				dp[i][j] = dp[i - 1][j + 1];
    			}
    			else dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1]) % mod;
    		}
    	}
    	for(int i = 0;i <= n - m; ++i) {
    		for(int j = 0;j <= i; ++j) {
    			if(j + sum <= n - m && j + mn >= 0) {
    				ans = (ans + dp[i][j] * dp[n - m - i][j + sum])%mod;
    			}
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    } 
    
  • 相关阅读:
    Python函数式编程(一):高级函数
    Python高级特性:列表生成式
    Python高级特性:迭代
    Python高级特性:切片
    Python学习笔记
    关于相机拍照获取图片onActivityResult返回data 为null的问题
    191019
    状语和状语从句
    191018
    191017
  • 原文地址:https://www.cnblogs.com/akoasm/p/9564431.html
Copyright © 2011-2022 走看看