POJ 2955 Brackets (区间DP)
<题目链接>
题目大意:
问一个[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<=100)串中最多的匹配字符个数。
解题分析:
区间DP果题。令$dp[i][j]$为区间$[l,r]$中最多能够匹配的字符个数,对于区间两端字符能够匹配的情况,$dp[[l][r]$能够由$dp[l+1][r-1]+2$转移过来(对于区间长度为2,且两端符号能够匹配的情况特判一下),然后就是进行区间DP的$O(n^3)$转移了。
#include <cstdio> #include <string> #include <algorithm> #include <cstring> #include <iostream> using namespace std; int dp[105][105]; string str; bool juge(int l,int r){ if(str[l]=='('&&str[r]==')')return true; if(str[l]=='['&&str[r]==']')return true; return false; } int main(){ while(cin>>str){ if(str=="end")break; memset(dp,0,sizeof(dp)); int length=str.size(); for(int len=1;len<=length;len++){ for(int l=0;l+len-1<length;l++){ int r=l+len-1; if(juge(l,r)&&len==2)dp[l][r]=2; else if(juge(l,r)&&len>2)dp[l][r]=dp[l+1][r-1]+2; for(int k=l;k<r;k++) dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]); } } printf("%d\n",dp[0][length-1]); } }
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。