poj 2955 Brackets
http://poj.org/problem?id=2955
// 求最长合法子序列
// 区间 dp
// dp[i][j] 表示区间 i,j 的最长合法子序列
#include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 #define maxn 110 int dp[maxn][maxn]; char a[110]; bool cmp(char c1 ,char c2){ if(c1=='('&&c2==')') return true; if(c1=='['&&c2==']') return true; return false; } int main() { while(scanf("%s",a)){ if(strcmp(a,"end")==0) break; int i,j,k; int len=strlen(a); for(i=0;i<len;i++) { dp[i][i]=0; if(cmp(a[i],a[i+1])) dp[i][i+1]=2;else dp[i][i+1]=0; } for(k=3;k<=len;k++){ for(i=0;i+k-1<len;i++){ dp[i][i+k-1]=0; if(cmp(a[i],a[i+k-1])) dp[i][i+k-1]=dp[i+1][i+k-2]+2; for(j=i;j<i+k-1;j++) dp[i][i+k-1]=max(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]); } } printf("%d\n",dp[0][len-1]); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步