间隔DP基础 POJ2955——Brackets
2015-12-09 16:35
330 查看
取血怒。first blood,第一区间DP,这样第一次没有以某种方式在不知不觉中下降~~~
题目尽管是鸟语。但还是非常赤裸裸的告诉我们要求最大的括号匹配数。DP走起~
dp[i][j]表示区间[i,j]的最大匹配数。那么最重要的状态转移方程就是:
dp[i][j]=max(dp[i][k]+dp[k+1][j])
对啦,要先初始化边界啊。两步走~:
memset(dp,0,sizeof dp);
if str[i]==str[i+1] 则:dp[i][i+1]=2 请看---->> 该字符串 ( [ ] [ ] [ ) 非常好懂有木有
万恶的贴代码:
题目尽管是鸟语。但还是非常赤裸裸的告诉我们要求最大的括号匹配数。DP走起~
dp[i][j]表示区间[i,j]的最大匹配数。那么最重要的状态转移方程就是:
dp[i][j]=max(dp[i][k]+dp[k+1][j])
对啦,要先初始化边界啊。两步走~:
memset(dp,0,sizeof dp);
if str[i]==str[i+1] 则:dp[i][i+1]=2 请看---->> 该字符串 ( [ ] [ ] [ ) 非常好懂有木有
万恶的贴代码:
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int dp[110][110]; char s[110]; bool check(int i,int j)//推断是不是匹配的 { if(s[i]=='['&&s[j]==']') return true; if(s[i]=='('&&s[j]==')') return true; return false; } int main() { while(scanf("%s",s)!=EOF){ if(strcmp(s,"end")==0) break; int l=strlen(s); memset(dp,0,sizeof dp); for(int i=0;i<l;i++){ //初始化 if(check(i,i+1)){ dp[i][i+1]=2; } } for(int p=3;p<=l;p++){ //枚举区间长度 for(int i=0;i<=l-p;i++){ //枚举区间起点 int j=i+p-1; if(check(i,j)){ dp[i][j]=dp[i+1][j-1]+2; } for(int k=i;k<j;k++){ //将区间分成两段 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]); } } } cout<<dp[0][l-1]<<endl; } return 0; }
相关文章推荐
- SqlServer 格式化时间
- js实现微信分享代码
- Android中View的触摸事件涉及到哪些方法?他们之间有什么关系?
- 在windows平台下安装MangoDB3.0.7 设置超级管理员服务启动
- Java——常见的HTTP状态码:
- 报告一个IE很奇葩的滚动条问题——百分比计算宽度为浮点数时的滚动条显示异常...
- Android之TabHost
- VC++ 调用 C#生成DLL的两种方法
- 编译Android系统源码和内核源码
- html css 十一条网页设计经典实用的代码片段
- MFC 之双缓冲
- CentOS更改yum源与更新系统
- 设计模式 -- 依赖倒置原则
- Android必学之AsyncTask
- 夺命雷公狗---Smarty NO:10 foreach数组的遍历
- 报告一个IE很奇葩的滚动条问题——百分比计算宽度为浮点数时的滚动条显示异常
- 正则表达式30分钟入门教程
- IntelliJ IDEA的jsp中request等对象无法被解析的解决办法
- App应用测试平台
- BestCoder Round #63 (div.2)