POJ 2955 Brackets【区间dp】
来源:互联网 发布:下载excel表格软件 编辑:程序博客网 时间:2024/06/07 09:50
Brackets
POJ - 2955p [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目
假如第 i 个和第 j 个是一对匹配的括号那么 dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ;
从小到大枚举所有 i 和 j 中间的括号数目,然后满足匹配就用上面式子dp,然后每次更新dp [ i ] [ j ]为最大值。
更新最大值的方法是枚举 i 和 j 的中间值,然后让 dp[ i ] [ j ] = max ( dp [ i ] [ j ] , dp [ i ] [ f ] + dp [ f+1 ] [ j ] ) 。
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#include<stack>#include<vector>#include<map>#include<algorithm>using namespace std;#define ll long long#define ms(a,b) memset(a,b,sizeof(a))const int M=1e3+10;const int inf=0x3f3f3f3f;const int mod =1e9+7;int dp[110][110];char s[110];int main(){ while(scanf("%s",s+1)==1 && s[1]!='e'){ int len = strlen(s+1); memset(dp,0,sizeof(dp)); for(int i=len-1;i>=1;i--) for(int j=i+1;j<=len;j++){ dp[i][j]=dp[i+1][j]; for(int k=i+1;k<=j;k++){ if(s[i]=='('&&s[k]==')' || s[i]=='['&&s[k]==']') dp[i][j] = max( dp[i][j], dp[i+1][k-1]+dp[k+1][j]+2); } } printf("%d\n",dp[1][len]); }}
0 0
- poj 2955 Brackets(区间DP)
- poj 2955 Brackets 【区间DP】
- POJ 2955 Brackets(区间DP)
- poj-2955 Brackets 区间dp
- POJ 2955 Brackets (区间dp)
- POJ 2955 Brackets 区间DP
- poj 2955 Brackets(区间dp)
- POJ 2955 - Brackets(区间DP)
- poj 2955 Brackets 区间dp
- poj 2955 Brackets(区间DP)
- 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] poj 2955 Brackets
- POJ 2955 Brackets(区间dp)
- C语言的数据类型
- 我的二维码
- Sass进阶一
- rsync 后台服务模式
- GitHub
- POJ 2955 Brackets【区间dp】
- 《算法图解》高清PDF版
- Maximum Product Subarray
- Ubuntu无法找到add-apt-repository问题的解决方法
- 算法课第12周第2题——63. Unique Paths II
- ssm项目(一)Shiro使用详解
- 【软考】软件开发模型+开发方法
- 学习代码-拳头游戏
- G