您的位置:首页
poj 2955 Brackets 括号匹配 区间dp
2017-08-19 18:31
483 查看
题意:最多有多少括号匹配
思路:区间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
代码:
思路:区间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; }
相关文章推荐
- POJ 2955 Brackets 区间DP 最大括号匹配
- POJ 2955 Brackets --最大括号匹配,区间DP经典题
- POJ 2955 Brackets 括号匹配 区间DP
- NYOJ 15 括号匹配(二) POJ 2955 Brackets(区间dp)
- POJ 2955-Brackets(括号匹配-区间DP)
- POJ 2955-Brackets(括号匹配-区间DP)
- POJ - 2955 Brackets(区间dp,括号匹配)
- POJ2955 Brackets(区间DP,括号匹配)
- POJ 2955-Brackets(括号匹配-区间DP)
- POJ-2955 Brackets(括号匹配-区间DP)
- 【POJ 2955】【经典区间DP 递推写法】 Brackets 【合法括号匹配成功结果+2,求最大结果】
- POJ 2955 Brackets (区间dp 括号匹配)
- POJ 2955 Brackets(括号最大匹配,区间DP)
- POJ 2955 Brackets (区间DP,括号匹配)
- POJ 2955 括号匹配 Brackets (区间DP)
- POJ 2955 Brackets (区间dp 括号匹配)
- poj 2955 Brackets(括号匹配,区间DP)
- 【区间DP】NYOJ 737石子合并+POJ 2955 Brackets(括号匹配)+NYOJ 15 括号匹配(二)
- poj2955括号匹配 区间DP
- poj 2955 区间dp 括号匹配