FZU 2030 括號問題 (DP)

2021-08-19 14:04:14 字數 1152 閱讀 4254

problem 2030 括號問題

給出乙個字串,其中包括3種字元: 『(『, 『)』, 『?』.其中?表示這個字元可以是』(『也可以是』)』. 現在給出字串s,你可以在』?』處填寫』(『 或者 『)』,當然隨意填寫得到的序列可能是括號不匹配的。例如」(?」,如果你填寫』(『那麼」((「是括號不匹配的! 現在你的任務是確定你有多少種填寫方案,使得最終的字串是括號匹配的!2種方案是不同的,當2種方案中至少存在1個填寫字元是不同的。 例如,對於」((??))」,我們可以得到2種方案: 「((()))」, 「(()())」。

資料報含多組測試資料第一行輸入乙個字串s(s的長度不超過16)。

輸出乙個整數,表示合法的填寫方案數。

((??)) 2

福州大學第八屆程式設計競賽 

解題思路:用乙個二維陣列dp,dp[i][j]表示遍歷到第i+1個字元時,有j個未匹配的『(』的方案有多少種。所以,

當s[i]=』(『時,當前有j個未匹配的『(』的方案數 == 還沒遍歷這個字元時的j-1個未匹配的『(』方案數。

即,dp[i][j] = dp[i-1][j-1]。

當s[i]=』)『時,當前有j個未匹配的『(』的方案數 == 還沒遍歷到這個字元的j+1個未匹配的『(』方案數。

即,dp[i][j] = dp[i-1][j+1]。

當s[i]= '?'時,即把前兩種情況都考慮進來。dp[i][j] = dp[i-1][j-1]+ dp[i-1][j+1] 。

最後輸入dp[len-1][0] , 即 第 len個字元時,有0個未匹配的』(『的方案數。。

#include#include#include#include#define ll long long

using namespace std;

const int maxn = 1e3+10;

const int inf = 0x3fffffff;

char s[maxn];

int dp[maxn][maxn];

int main()

else if(s[i]==')')

else dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1];

}} cout<} return 0;

}

FZU 2030 括號問題 爆搜 DP

problem 2030 括號問題 給出乙個字串,其中包括3種字元 其中?表示這個字元可以是 也可以是 現在給出字串s,你可以在 處填寫 或者 當然隨意填寫得到的序列可能是括號不匹配的。例如 如果你填寫 那麼 是括號不匹配的!現在你的任務是確定你有多少種填寫方案,使得最終的字串是括號匹配的!2種方案...

FZU 2030 括號問題(搜尋)

problem 2030 括號問題 給出乙個字串,其中包括3種字元 其中?表示這個字元可以是 也可以是 現在給出字串s,你可以在 處填寫 或者 當然隨意填寫得到的序列可能是括號不匹配的。例如 如果你填寫 那麼 是括號不匹配的!現在你的任務是確定你有多少種填寫方案,使得最終的字串是括號匹配的!2種方案...

FZU2030 括號匹配

題目大意 略 題目思路 資料範圍很小,可以搜尋,但是如果資料範圍較大則只能dp 用二維陣列表示狀態dp i j 表示掃瞄到第i個字元時有j個 還未完成匹配,而答案就是dp len 1 0 len表示字串長度,dp len 1 0 表示掃瞄完最後乙個字元後沒有未匹配的 include include ...