牛客IOI賽制測試賽 括號

2021-10-01 06:53:35 字數 1078 閱讀 5666

小a有乙個只包含左右括號的字串s。但他覺得這個字串不夠美觀,因為它不是乙個合法的括號串。乙個合法的括號串是這樣定義的:

1. ()是合法的括號串

2. 若a是合法的括號串,則(a)則是合法的括號串

3. 若a,b是合法的括號串,則ab也是合法的括號串。

小a現在希望刪掉s中若干個字元,使得剩下的字串是乙個合法的括號串。小a想知道有多少不同的方案。兩個方案是不同的,當且僅當他們刪除的位置不同。比如當s是(()時,有兩種方案。分別是刪掉第乙個位置,或是刪掉第二個位置。

第一行乙個整數n,代表s的長度。

第二行輸入n個字元,字元要麼是(,要麼是)。代表串s。

一行乙個整數,代表不同的方案數。答案對10^9+7取模。
示例1

8

)(()(())

30
20%: n <= 20

40%: n <= 100

60%: n <= 1000

100%: n <= 10000

用f[i][j] 表示對於前i個字元,有j個左括號未匹配的方案數。

如果當前字元是左括號,那麼f[i][j]=f[i-1][j]+f[i-1][j-1];

如果當前字元是右括號,那麼f[i][j]=f[i-1][j]+f[i-1][j+1];

初狀態 f[0][0]=1; 假設空串也算合法的。

答案應該是 f[n][0]-1。   -1是去掉空字串的方案。

用滾動陣列將空間複雜度優化成o(n).

#includeusing namespace std;

typedef long long ll;

const int mod=1e9+7;

const int maxn=10005;

ll f[maxn];

int n;

char s[maxn];

int main()

}else}}

ll ans=(f[0]-1+mod)%mod;

printf("%lld\n",ans);

return 0;

}

牛客OI賽制測試賽1

a 斐波那契 設f i 表示斐波那契數論的第i項 f 1 1,f 2 1,f i f i 1 f i 2 給定乙個n 求乙個整數n乙個整數,表示答案示例1 複製4複製 1對於的資料,對於的資料,對於的資料,對於的資料,思路 輸出一下找下規律 如下 include include include in...

牛客OI賽制測試賽2

題目描述 給出乙個二元組 a,b 求出無序二元組 a,b 使得 a a,b b 的組數 無序意思就是 a,b 和 b,a 算一組.輸入描述 第一行資料組數 t 1 t 10000 接下來t行,每行兩個正整數 a,b 1 a,b 10000 輸出描述 共t行,每行乙個結果 組合,求a和b的因子個數,乘...

2018 09 18 牛客OI賽制測試賽3

小a有乙個n位的數字,但是它忘了各個位上的數是什麼,現在請你來確定各個位上的數字,滿足以下條件 設第i位的數為ai,其中a1為最高位,an為最低位,k為給定的數字 1.不含前導0 2.請你求出滿足條件的方案數 發現答案只和k有關,正數是9 k,負數是10 k,然後快速冪pow 10,n 2,mod ...