10pts 求指出思路错误
查看原帖
10pts 求指出思路错误
582123
Njaso楼主2024/10/25 18:48
#include <bits/stdc++.h>
using namespace std;

#define db(x) cerr<<#x<<"="<<(x)<<" "
#define el cerr<<endl
#define ll long long

const int N=5005;
const ll MOD=1e9+7;
ll dp[N][N]; //dp[i][j]: 前i个(,加了j个)
ll sum[N];
int cnt[N];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    cin>>s;
    int n=s.size();
    s=' '+s;
    int cntl=0;
    for(int i=1;i<=n;i++){
        if(s[i]=='('){
            cntl++;
            for(int j=i+1;j<=n;j++){
                if(s[j]=='('){
                    i=j-1;
                    break;
                }else{
                    cnt[cntl]++;
                }
            }
        }
    }
    dp[0][0]=1;
    int cur=0;
    for(int i=0;i<=5000;i++){
        sum[i]=1;
    }
    for(int i=1;i<=cntl;i++){
        cur+=cnt[i];
        for(int j=0;j<=i-cur;j++){
            int k=min(j,i-1-cur+cnt[i]);
            dp[i][j]+=sum[k];
            dp[i][j]%=MOD;
        }
        for(int j=0;j<=5000;j++){
            if(j==0){
                sum[j]=dp[i][j];
            }else{
                sum[j]=sum[j-1]+dp[i][j];
                sum[j]%=MOD;
            }
        }
    }
    cout<<dp[cntl][cntl-cur]<<'\n';
    return 0;
}

dp[i][j]表示对于前i个左括号添加了j个右括号 cnt[i]表示第i到i+1个左括号之间有多少个右括号

dp[i][j]=dp[i1][jk] 对于所有的k满足jki1j=1i1cnt[i]dp[i][j]=\sum{dp[i-1][j-k]} \space 对于所有的k满足j-k\le i-1-\sum_{j=1}^{i-1}{cnt[i]}
2024/10/25 18:48
加载中...