題目:
/*
問題:給你乙個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。
如:是匹配的,所需括號個數為 0.
()是匹配的, 所需括號個數為 0.
((]是不匹配的, 所需最少括號個數為 3.
([)]是不匹配的,所需最少括號個數為 2.
分析:此題來自: 作者同時給出了正確答案。但是,感覺答案還不是特別的詳細,也不是特別容易懂。所以,在此寫下自己的分析思路。
1. 我們用 mb[i][j] 表示從位置 i 到字元位置 j 所需的最少括號數。假定字串是 「[ ( )」, 那麼 mb[0][0] = mb[1][1] = mb[2][2] = 1。
2. 如果我們要算mb[i][j+1], 那麼,最壞的情況是使得沒有被匹配的括號數增加了,即 mb[i][j+1] 最多為 min( mb[i][j] + 1, mb[i+1][j+1] + 1). 但是,這可能不是我們想要的答案,因為在剛才的例子裡,即:假定字串是 「[ ( )」, 那麼 mb[0][1] = mb[0][0] + 1= 2, 但是 mb[1][2] 卻不等於 mb[1][1] + 1.
3. 那麼,什麼情況下mb[i][j+1] = mb[i][j] + 1?只有當 字串裡從i 到 j 沒有任何字元與第 j + 1 個字元匹配的時候。但是,如果存在和第 j + 1 個字元匹配的情況,問題就不一樣了。
4. 假設在i 到 j 之間存在乙個字元(比如在位置 k)與第 j + 1 個字元匹配,那麼我們相當於把原來的字串分成了兩個部分mb[i][k-1] 和 mb[k+1][j], 因為第k 個 和 j + 1 個字元已經匹配掉了。而且,我們不會再考慮 i 到 k - 1 的字元會和 k + 1 到 j 之間的字元匹配的情況,因為我們已經把這兩個部分完全分開了(很重要的一點,這也是我當時思考很久的地方)。話句話說 mb[i][j+1] = min(min( mb[i][j] + 1, mb[i+1][j+1] + 1), mb[i][k-1] + mb[k+1][j]).
有了這樣的分析,我們可以利用動態規劃的思路來解決這樣的問題。**如下:
思路來自:
自己又寫了一遍。
*/#include #include #include using namespace std;
const int dpsize=105;
int dp[dpsize][dpsize];
bool ismatch(const char& s1,const char &s2)
return false;
}void sulotion(const string &str)
return 0;
}
括號匹配(二)
時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...
括號匹配(二)
演算法 動態規劃 描述給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s,s中只包含以上所說的四種字元,s的長度不超過10...
括號匹配(二)
時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...