本文共 902 字,大约阅读时间需要 3 分钟。
题意:最多有多少括号匹配
思路:区间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#include #include #include 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== "< < =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== "< <<" j== "< <<" dp[i][j]== "< <
转载地址:http://vygji.baihongyu.com/