首页 > 代码库 > POJ2955 Brackets (区间DP)
POJ2955 Brackets (区间DP)
题目链接:
http://poj.org/problem?id=2955
题意:
一个区间内最长的匹配的括号的最大长度
分析:
我们设DP[i][j]表示从i,到j 的最长的匹配的括号的长度,
如果i-1与j+1是匹配的话 那么 DP[i-1][J+1]=DP[i][j]+2;
DP[i][j]=max{DP[i][j],dp[i][k]+dp[k+1][j]};
代码如下:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn = 110; int dp[maxn][maxn]; char a[maxn]; bool judge(int i,int j) { if(a[i]=='('&&a[j]==')'||a[i]=='['&&a[j]==']') return true; return false; } int main() { while(~scanf("%s",a)){ if(strcmp(a,"end")==0) break; int len=strlen(a); memset(dp,0,sizeof(dp)); for(int i=2;i<=len;i++){//枚举长度 for(int j=0;j+i-1<len;j++){//枚举起点 int e = j+i-1; if(judge(j,e)) dp[j][e]=dp[j+1][e-1]+2; for(int k=j;k<e;k++) dp[j][e]=max(dp[j][k]+dp[k+1][e],dp[j][e]); } } printf("%d\n",dp[0][len-1]); } return 0; }
POJ2955 Brackets (区间DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。