poj 1141 區間dp 列印路徑

2021-07-11 04:49:26 字數 959 閱讀 5125

題意:

定義合法的括號序列如下:

1 空序列是乙個合法的序列

2 如果s是合法的序列,則(s)和[s]也是合法的序列

3 如果a和b是合法的序列,則ab也是合法的序列

例如:下面的都是合法的括號序列

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

下面的都是非法的括號序列

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

給定乙個由'(',  ')',  '[', 和 ']' 組成的序列,找出以該序列為子串行的最短合法序列。

解題思路:這題只是普通的區間dp多了乙個路徑輸出的過程,dp[i][j]表示i-j要匹配需要修改的最小值。輸出路徑的時候只要根據狀態轉移方程就可以確定了。這裡有乙個要注意的地方,如果說i和j是(和),dp[i][j]不一定就是dp[i+1][j-1],因為i和j不一定就是最後要匹配的,i,j可能和中間的括號匹配。例如:

詳細的見**:

#include#include#include#define min(a,b) a < b ? a : b

using namespace std;

const int maxn = 105;

const int inf = 0x7fffff;

int n,dp[maxn][maxn],c[maxn][maxn];

char str[maxn];

void path(int l,int r)

if((str[l] == '(' && str[r] == ')' || str[l] == '[' && str[r] == ']') && dp[l][r] == dp[l+1][r-1])

else }

}int main()

path(1,n);

printf("\n");

} return 0;

}

poj 1141(區間dp 滾動陣列)

題意 有m個人,我們任選3個人組成乙個隊伍,可以組成c m,3 種隊伍,給出這些隊伍之間的勝率。現在,需要你戰勝n個隊伍。戰勝該隊伍,你可選擇用戰勝的隊伍來替換你現有的隊伍。現在要求戰勝這n個隊伍的最大概率。思路 因為對於戰勝的隊伍,我們可以選擇替換還是不替換,這就像01揹包。因為n非常大,我們需要...

POJ 1141 括號區間DP

1.題目鏈結。其實這個題目就是一般的區間dp,不過感覺輸出還是需要一點技巧的。2.dp i j 表示區間 i,j 需要加的括號的最小的數量,那就分為兩種情況討論,s i 與s j 匹配的時候,s i 與s j 不匹配的時候。匹配的時候直接就是有dp i 1 j 1 轉移而來,不匹配的時候,列舉中間點...

poj1141(括號匹配 區間dp)

題意 給乙個括號序列,問包含此序列的最短合法括號序列 解法 普通的區間dp,num i j 記錄的是i j子串行最少需要補充的括號個數,只是在要記錄區間的最優分界點rem i j 從而將最短合法括號序列輸出,複雜度o n 3 include include include using namespa...