天天看點

NYOJ 15 括号比對(二) dp

題目連接配接:

題意是說給一個字元串,包含‘(‘,‘)‘,‘[‘,‘]‘四種字元,判斷至少需要添加幾個字元使所給字元串括号比對。

區間型動态規劃,設dp[i][j]表示在字元串s中i位置到j位置所需要添加的最少的字元(i <= j)

有兩種情況:

1、dp[i][j] = dp[i+1][j] + 1; 

表示:在i到j之間沒有與s[i]相比對的括号,則必須添加一個字元來與之比對,問題就轉化為:從i+1位置到j位置所需要添加的最少的字元+1。

2、dp[i][j] = min{ dp[i+1][k-1] + dp[k+1][j] }; (i < k <= j)

表示:在i到j之間找到一個k使得s[i]與s[k]相比對,則問題就轉化為求:從i+1到k-1所需要添加的最少字元個數+從k+1到j之間所需要添加的最少字元個數(即dp[i+1][k-1] + dp[k+1][j])。因為k可能有多個,是以在其中所有的k的情況中取最小的。

求出兩種情況後,這兩種之間再求最小值,可以直接把dp[i][j]的初始值賦為dp[i+1][j]+1,然後進行第二種情況的求解

動态轉移方程出來之後需要判斷寫幾層循環和每層循環的起點和終點,從方程可以看出,有3層循環(i, j, k),對于dp[i][j]來說,必須先求出i之後的行的前j個,是以有兩種循環的方法,我用的是第二種方法,感覺相對好了解。如下圖。

NYOJ 15 括号比對(二) dp
NYOJ 15 括号比對(二) dp

                         方式一:從左往右更新                         方式二:從下往上更新

初始化:隻有一個字元時至少添加一個字元,是以dp[i][i] = 1;

附上ac代碼: