题意:最多有多少括号匹配
思路:区间dp,模板dp,区间合并。
对于a[j]来说:
刚開始的时候,转移方程为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k][j-1]+2), a[k]与a[j] 匹配,结果一组数据出错
([]])检查的时候发现dp[2][3]==2,对,dp[2][4]=4,错了,简单模拟了一下发现,dp[2][4]=dp[2][1]+dp[2][3]+2==4,错了
此时2与4已经匹配,2与3已经无法再匹配。
故转移方程改为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k+1][j-1]+2)。a[k]放弃使用,幸运的一次ac
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; char a[110]; int dp[110][110]; int main() { while(scanf("%s",a+1)!=EOF) { int lena=strlen(a+1); int i,j,k; if(lena==3&&a[1]=='e'&&a[2]=='n'&&a[3]=='d') { break; } //cout<<"lena== "<<lena<<endl; memset(dp,0,sizeof(dp)); for(i=lena-1;i>=1;i--) { for(j=i+1;j<=lena;j++) { dp[i][j]=dp[i][j-1]; for(k=i;k<=j-1;k++) { if((a[k]=='('&&a[j]==')')||(a[k]=='['&&a[j]==']')) { dp[i][j]=max(dp[i][k-1]+dp[k+1][j-1]+2,dp[i][j]); } } //cout<<"i== "<<i<<" j== "<<j<<" dp[i][j]== "<<dp[i][j]<<endl; } } cout<<dp[1][lena]<<endl; } return 0; }