pid=15
dp[i][j]表示從i到j至少須要加入多少個括號才幹滿足匹配條件.
初始化:
if(i == j)
dp[i][j] = 1;
else
dp[i][j] = inf;
狀態轉移:
當i < j時;
if(match(str[i], str[j])) dp[i][j] = min(dp[i][j], d[i + 1][j - 1]);
然後切割區間, 找最優切割點k. (i <= k <= j);
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
迴圈時, 遍歷區間(i...j)的起點i以及區間長度len, len從小到大依次遞增.
即迴圈找出每一段起點為i長度為len的區間的最優解, 慢慢擴大至整個區間.即終於問題的解!
#include #include #include #include #include #include #include #include #include #include #include #include #include #define cl(x,v); memset(x,v,sizeof(x));
#define inf 1<<29
#pragma comment(linker, "/stack:1024000000,1024000000")
using namespace std;
const int n = 100 + 10;
int dp[n][n];
char str[n];
int match(char ch1, char ch2)
int main()
}cout << dp[0][length - 1] << endl;
}return 0;
}
NYOJ 15 括號匹配(二)區間dp
時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...
NYOJ 15 括號匹配(二) 區間DP
括號匹配 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,...
NYOJ15 括號匹配(二)(區間dp)
時間限制 1000 ms 記憶體限制 65535 kb 難度 6 描述 給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 輸入第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s...