初學DP(1) 黑書中的《括號序列》

2021-06-27 05:59:41 字數 1239 閱讀 2025

題目:括號序列

定義如下規則序列(字串):

1.空序列是規則序列;

2.如果s是規則序列,那麼(s)和[s]也是規則序列;

3.如果a和b都是規則序列,那麼ab也是規則序列;

例如,下面的字串都是規則序列:

(),    ,    (()),    (),    ()[()];

而這幾個就不是規則序列:

(,    [,    )(,    (;

現在給出一些有'(',')','[',']'構成的序列,請新增少量的括號,得到乙個規則的序列。

分析:用s[i],s[j]表示字串s的第i個字元和第j個字元,i如果s[i]='(',s[j]=')'或

s[i]='[',s[j]=']',那麼ans[i][j]=min(ans[i+1][j-1],ans[i][j]);

如果s[i]='(',s[j]!=')'或

s[i]='[',s[j]!=']',那麼ans[i][j]=min(ans[i+1][j]+1,ans[i][j]);

如果s[i]!='(',s[j]=')'或

s[i]!='[',s[j]=']',那麼ans[i][j]=min(ans[i][j-1]+1,ans[i][j]);  

根據這個我們有如下遞推關係:

int bracket(int i,int j)}}

}cout<

poj 1141    

題目意思和上面一樣,只是題目要你求出這個規則序列,為此我們只需要記錄需要插入的位置,當我們需要輸出時,採用遞推的方式,對於從s[i]到s[j]的序列,如果pos[i][j]=-1則說明s[i]和s[j]括號匹配,我們可以先輸出s[i],再繼續考慮s[i+1]到s[j-1]的序列,最後輸出s[j],如果pos[i][j]不等於-1則說明s[i]和s[j]不匹配,我們就需要對s[i]進行匹配,輸出匹配後,我們再繼續考慮s[i+1]到s[j]的序列;

#include #include using namespace std;

#define inf 0xffffff

int dp[105][105];

int pos[105][105];

char s[105];

void show(int i,int j)

else

}} }

show(0,n-1);

cout<

注意:在poj上提交時如果用while(cin>>s)這個迴圈輸入的話會使提交結果為wa,我也不知道為什麼。。。

dp1 乘積最大

一 心得 1 用excel填陣列很方便 2 dp就是填表 找狀態就是縮小規模 找狀態轉移方程就是 找狀態的最後一次關係 二 題目 總時間限制 1000ms 記憶體限制 65536kb 描述今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江...

dp 1 跳台階問題

問題 共n層台階,每次只能上1級或者2級,問有多少種上台階的方法。首先分析一下題目,一般這種問題我都會先找一下規模最小的數值來分析一下,可以看到,上一層的走法是1種 1 上2層的走法是2種 11,2 三層有3種 12,21,111 四層有5種 1111,22,211,121,112 偷偷發現好像是斐...

DP1 動態規劃概述

計數求最大值最小值 求存在性 確定狀態 簡單的說,就是解動態規劃時需要開乙個陣列,陣列的每個元素f i 或者f i j 代表什麼,類似解數學題中,xyz代表什麼一樣,具體分為下面兩個步驟 轉移方程 根據子問題定義直接得到 初始條件和邊界情況 初始條件一般都是a 0 a 1 這種,多看看邊界條件主要是...