題目:括號序列
定義如下規則序列(字串):
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 這種,多看看邊界條件主要是...