【区间dp】POJ 2955 Brackets
2016-11-05 11:53
344 查看
/* date: 2016/11/5 writer: CN_swords 题意: 给你一个字符串,寻找最长的匹配串的长度。 题解: 定义:dp[i][j] 代表区间(i,j)最长匹配串的长度; 初始化: dp[i][j] = 0; 对于dp[i][j],在(i+1,j)区间如果没找到与i匹配的字符,dp[i][j] = dp[i+1][j]; 在(i+1,j)区间如果找到与i匹配的字符,位置为k,那么dp[i][j] = dp[i+1][k-1]+dp[k+1][j]+2; */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; char s ; int dp[N][N]; bool pan(char a,char b) { if(a == '(' && b == ')') return 1; if(a == '[' && b == ']') return 1; return 0; } int main() { while(~scanf("%s",s)) { if(strcmp(s,"end") == 0) break; int slen = strlen(s); memset(dp,0,sizeof(dp)); for(int len = 1; len < slen; len++) { for(int i = 0; i+len < slen; i++) { int l = i, r = i+len; dp[l][r] = dp[l+1][r]; for(int k = l+1; k <= r; k++) { if(pan(s[i],s[k])) dp[l][r] = max(dp[l][r],((k-l>=3)?dp[l+1][k-1]:0)+dp[k+1][r]+2); } } } printf("%d\n",dp[0][slen-1]); } return 0; }
相关文章推荐
- POJ 2955 Brackets 区间dp
- POJ 2955 Brackets 【区间DP】
- poj 2955 Brackets(区间DP)
- Poj 2955 Brackets【区间dp】
- POJ - 2955Brackets(区间DP)
- poj 2955 Brackets (区间DP)
- poj-2955 Brackets 区间dp
- POJ 2955 Brackets 【区间DP】
- poj 2955 Brackets(区间DP)
- poj 2955 Brackets(区间dp)
- [区间dp] poj 2955 Brackets
- poj 2955 Brackets(括号匹配,区间DP)
- POJ 2955 Brackets (区间DP)
- POJ 2955 Brackets【区间DP】
- poj 2955 Brackets( 区间dp )
- poj 2955 Brackets(区间dp)
- POJ 2955 Brackets & POJ 1505 Copying Books & POJ 1651 Multiplication Puzzle(初级区间DP)
- POJ 2955 Brackets [区间DP]【动态规划】
- 【DP】 POJ 2955 Brackets 区间DP
- POJ 2955 Brackets 区间DP