首页 > 代码库 > 区间DP基础篇之 POJ2955——Brackets
区间DP基础篇之 POJ2955——Brackets
怒拿一血,first blood,第一个区间DP,第一次就这样子莫名其妙不知不觉滴没了~~~
题目虽然是鸟语,但还是很赤裸裸的告诉我们要求最大的括号匹配数,DP走起~
dp[i][j]表示区间[i,j]的最大匹配数,那么最重要的状态转移方程就是:
dp[i][j]=max(dp[i][k]+dp[k+1][j])
对啦,要先初始化边界啊,两步走~:
memset(dp,0,sizeof dp);
if str[i]==str[i+1] 则:dp[i][i+1]=2 请看---->> 该字符串 ( [ ] [ ] [ ) 很好懂有木有
万恶的贴代码:
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int dp[110][110]; char s[110]; bool check(int i,int j)//判断是不是匹配的 { if(s[i]=='['&&s[j]==']') return true; if(s[i]=='('&&s[j]==')') return true; return false; } int main() { while(scanf("%s",s)!=EOF){ if(strcmp(s,"end")==0) break; int l=strlen(s); memset(dp,0,sizeof dp); for(int i=0;i<l;i++){ //初始化 if(check(i,i+1)){ dp[i][i+1]=2; } } for(int p=3;p<=l;p++){ //枚举区间长度 for(int i=0;i<=l-p;i++){ //枚举区间起点 int j=i+p-1; if(check(i,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][j]); } } } cout<<dp[0][l-1]<<endl; } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。