小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用f[i][j] 表示對於前i個字元,有j個左括號未匹配的方案數。40%: n <= 100
60%: n <= 1000
100%: n <= 10000
如果當前字元是左括號,那麼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 ...