南陽理工學院動態規劃專題括號問題2總結
這道題目初看起來很簡單,但是我從看題到思考,到做題ac足足花了乙個晚上加乙個下午的時間,我也有到網上找**的習慣,但是都是遞迴,特別蛋疼,我想用正統的動歸去做,於是就開始了不一樣的艱難探索之旅。
分析過程:
使用char str[1001]這個字元陣列儲存最初輸入的括號序列,使用dp[1001][1001]這個陣列儲存中間結果,dp[i][j]的意思是從下標為i的字元到下標為j的字元的子問題最少要加多少個括號才能規範化。首先dp陣列初始化為零,顯然dp[i][i]=1;至於dp[i][i+1],當str[i][i+1]配對的時候=0,當str[i][i+1]不配對的時候=2;到了這一步初始化工作結束。
如果str[i]和str[j]配對則分為兩種情況: 1.
i->(…)(…)<-j,則dp[i][j]=min; 2.
i->(..(..)..)<-j,則dp[i][j]=dp[i+1][j-1],因為之前dp[i+1][j-1]已經計算過,因此直接使用即可。
如果str[i]和str[j]不配對分為四種情況: 1.
在str[i+1]到str[j]的字串當中有與str[i]配對的括號,其對應的下標序列為k1,k2,k3,…
則dp[i][j]=min;
2.當不存在與str[i]相匹配的括號時直接使用dp[i][j]=dp[i+1][j]+1;
3.在str[i]到str[j-1]的字串當中有與str[j]配對的括號,其對應的下標序列為k1,k2,k3,…
則dp[i][j]=min;
4.不存在與str[i]相匹配的括號時直接使用dp[i][j]=dp[i][j-1]+1;
計算完成後dp[0][strlen(str)-1]即是計算結果。
ac**:
#include#include#include#define inf 100000000
using namespace std;
char str[101];
int dp[101][101];
bool match(char ch1,char ch2)
int main()
int min2=dp[i+1][j-1];
dp[i][j]=min(min1,min2);
}else
}int min2=dp[i+1][j]+1;
int min3=in
for(intkk=i+1;kkt)
min1=t;}}
int min4=dp[i][j-1]+1;
dp[i][j]=min(min(min1,min2),min(min3,min4));}}
}cout<
括號匹配(二)
時間限制:1000 ms |
記憶體限制:65535 kb
難度:6
描述
給你乙個字串,裡面只包含"(",")","[","]"
四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如:
是匹配的
()是匹配的
((]是不匹配的
([)]
是不匹配的
輸入
第一行輸入乙個正整數n
,表示測試資料組數(n<=10)
每組測試資料都只有一行,是乙個字串s,s中只包含以上所說的四種字元,s的長度不超過100
輸出
對於每組測試資料都輸出乙個正整數,表示最少需要新增的括號的數量。每組測試輸出佔一行
樣例輸入4
() ((]
([)]
樣例輸出0
0 3
2 **
《演算法藝術與資訊學競賽》
上傳者
張云聰
南陽理工學院動態規劃專題 回文字串
這個問題使用動態規劃求解,dp i j 表示字串下標為i的字元和下標為j的字元區間內構成回文所需加入的最少的字串。當str i str j 時,則dp i j dp i 1 j 1 當str i str j 時,dp i j min dp i 1 j 1,dp i j 1 1 初始化時候,d i i...
南陽理工學院動態規劃專題 回文字串
這個問題使用動態規劃求解,dp i j 表示字串下標為i的字元和下標為j的字元區間內構成回文所需加入的最少的字串。當str i str j 時,則dp i j dp i 1 j 1 當str i str j 時,dp i j min dp i 1 j 1,dp i j 1 1 初始化時候,d i i...
南陽理工學院ACM完全覆蓋
描述 有一天小董子在玩一種遊戲 用2 1或1 2的骨牌把m n的棋盤完全覆蓋。但他感覺遊戲過於簡單,於是就隨機生成了兩個方塊的位置 可能相同 標記一下,標記後的方塊不用覆蓋。還要注意小董子只有在m n的棋盤能被完全覆蓋後才會進行標記。現在他想知道 如果標記前m n的棋盤能被完全覆蓋,標記後的棋盤是否...