首页 > 代码库 > POJ 2955 (区间DP)
POJ 2955 (区间DP)
题目链接: http://poj.org/problem?id=2955
题目大意:括号匹配。对称的括号匹配数量+2。问最大匹配数。
解题思路:
看起来像个区间问题。
DP边界:无。区间间隔为0时,默认为memset为0即可。
对于dp[i][j],如果i和j匹配,不难有dp[i][j]=dp[i+1][j-1]+2.
然后枚举不属于两端的中点, dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]),合并两个区间的结果。
#include "cstdio"#include "string"#include "cstring"#include "iostream"using namespace std;bool check(char a,int b){ if(a==‘(‘&&b==‘)‘) return true; else if(a==‘[‘&&b==‘]‘) return true; else return false;}int dp[105][105];int main(){ //freopen("in.txt","r",stdin); string str; while(cin>>str&&str!="end") { int n=str.size(); for(int p=1;p<n;p++) { for(int i=0;i<n-p;i++) { int j=i+p; if(check(str[i],str[j])) dp[i][j]=dp[i+1][j-1]+2; for(int k=i+1;k<j;k++) dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]); } } printf("%d\n",dp[0][n-1]); memset(dp,0,sizeof(dp)); }}
POJ 2955 (区间DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。