首页 > 代码库 > poj2955 区间dp
poj2955 区间dp
1 //Accepted 200 KB 63 ms 2 //区间dp 3 //dp[i][j] 从i位到j位能得到的最大匹配数 4 //dp[i][j]=max(dp[i+1][j-1] (s[i-1]==s[j-1]),dp[i][k]+dp[k+1][j])i<=k<j 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 using namespace std; 9 const int imax_n = 105;10 int dp[imax_n][imax_n];11 char s[imax_n];12 int n;13 int max(int a,int b)14 {15 return a>b?a:b;16 }17 int isMatch(char ch1,char ch2)18 {19 if (ch1==‘(‘ && ch2==‘)‘) return 1;20 if (ch1==‘[‘ && ch2==‘]‘) return 1;21 return 0;22 }23 void Dp()24 {25 for (int i=1;i<=n;i++)26 dp[i][i]=0;27 for (int l=2;l<=n;l++)28 {29 for (int i=1;i<=n;i++)30 {31 int j=i+l-1;32 if (j>n) break;33 dp[i][j]=0;34 if (isMatch(s[i-1],s[j-1])) dp[i][j]=dp[i+1][j-1]+2;35 for (int k=i;k<j;k++)36 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);37 }38 }39 printf("%d\n",dp[1][n]);40 }41 int main()42 {43 while (scanf("%s",s) && s[0]!=‘e‘)44 {45 n=strlen(s);46 Dp();47 }48 return 0;49 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。