poj 2955 Brackets 【 区间dp 】
2015-08-17 09:12
423 查看
话说这题自己折腾好久还是没有推出转移的公式来啊------------------
只想出了dp[i][j]表示i到j的最大括号匹配的数目--ค(TㅅT)-------------------
后来搜题解看到有两种有一点点不同的做法
dp[i][j] = max(dp[i+1][j-1] + ok(i,j), dp[i][k] + dp[k+1][j])
View Code
只想出了dp[i][j]表示i到j的最大括号匹配的数目--ค(TㅅT)-------------------
后来搜题解看到有两种有一点点不同的做法
dp[i][j] = max(dp[i+1][j-1] + ok(i,j), dp[i][k] + dp[k+1][j])
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int d[505][505]; char s[505]; int n; int ok(int x,int y){ if(s[x] == '(' && s[y] == ')') return 2; if(s[x] == '[' && s[y] == ']') return 2; return 0; } int dp(int x,int y){ int& ans = d[x][y]; if(ans >= 0) return ans; if(x >= y) { ans = 0; return ans; } if(y == x+1) { ans = ok(x,y); return ans; } ans = dp(x+1,y); for(int k = x;k <= y;k++){ if(ok(x,k)) ans = max(ans,dp(x+1,k-1) + dp(k+1,y) + 2); // printf("ans = %d\n",ans); } return ans; } int main(){ while(scanf("%s",s+1) != EOF){ if(s[1] == 'e') break; n = strlen(s+1); memset(d,-1,sizeof(d)); int res = dp(1,n); //for(int i = 1;i <= n;i++) //for(int j = 1;j <= n;j++) // printf("d[%d][%d] = %d\n",i,j,d[i][j]); printf("%d\n",res); } return 0; }
View Code
相关文章推荐
- 测试步骤中设置断言
- 最长回文字串
- OpenStack Weekly Rank 2015.08.17
- Android友盟判断手机是否存在微博客户端
- BaseAdapter java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 dispatchTouchEvent
- Nginx上传文件全部缓存解决方案
- php 防止POST重复提交最简单方法
- 通用链表的设计与实现
- Gensim学习笔记-1--理解corpora.Dictionary
- 实现iOS 9 Task Switcher动画
- UVA 10651 Pebble Solitaire
- 《Java设计模式》之观察者模式(1)
- oracle 导入导出语句
- Android开发自学笔记(Android Studio1.3.1)—2.开始第一个Android应用
- 源码推荐(8.17):闪屏效果,简易动画引擎,iOS UIView自定义四个边角的圆角
- HDOJ-1698-线段树成段更新
- 关于私有继承
- CSS实现跨浏览器兼容性的盒阴影效果
- TCP/IP三次握手和四次挥手
- 给网站外链进行重定向跳转