首页 > 代码库 > POJ2955【区间DP】
POJ2955【区间DP】
题目链接【http://poj.org/problem?id=2955】
题意:[]、()的匹配问题,问一个[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<=100)串中最多的匹配字符个数。
思路:区间DP,dp[l][r]的意思是区间[l,r]的最大匹配数,预处理长度为2的所有区间的最大匹配数,然后由长度为2的区间推出长度为3的所有区间的最大匹配数,由长度为3的区间......在处理区间[l,r]的时候,如果s[l]与s[r]相匹配,那么dp[l][r]=dp[l+1][r-1]+2;然后再没去区间[l,r]的每个断点k,dp[l][r]=max(dp[l][r],dp[l][k],dp[k+1][r]);这一步是必须要执行的。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN = 150; int dp[MAXN][MAXN]; char s[MAXN]; int main () { while(~scanf("%s", s + 1)) { memset(dp, 0, sizeof(dp)); if(s[1] == ‘e‘) break; int len = strlen(s + 1); for(int l = 1; l <= len; l++) for(int i = 1; i <= len - l + 1; i++) { int j = i + l - 1; if((s[i] == ‘(‘ && s[j] == ‘)‘) || (s[i] == ‘[‘ && s[j] == ‘]‘)) dp[i][j] = dp[i + 1][j - 1] + 2; for(int k = i; k < j; k++) dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]); } printf("%d\n", dp[1][len]); } return 0; }
POJ2955【区间DP】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。