首页 > 代码库 > POJ 2955 Brackets (区间dp)
POJ 2955 Brackets (区间dp)
题目大意:
两种括号匹配,求最长的匹配长度。
思路分析:
状态方程:dp [i][j] 表示区间 i ~ j 之间最长的匹配长度。
转移方程:dp [i][j] = max (dp[i+1][j] , dp[i] [j-1 ] , dp[i+1][k-1] + dp[k+1][j] +2 (条件是i ,k 位置匹配))
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define maxn 105 using namespace std; char str[maxn]; int dp[maxn][maxn]; int main() { while(scanf("%s",str+1)!=EOF) { if(strcmp(str+1,"end")==0)break; int len = strlen(str+1); memset(dp,0,sizeof dp); for(int i=len-1;i>=1;i--) { for(int j=i+1;j<=len;j++) { dp[i][j] = max(dp[i+1][j],dp[i][j-1]); for(int k=i+1;k<=j;k++) { if((str[i]=='(' && str[k]==')') || (str[i]=='[' && str[k]==']')) dp[i][j] = max(dp[i][j],dp[i+1][k-1]+2+dp[k+1][j]); } } } printf("%d\n",dp[1][len]); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。