POJ 2955 Brackets (区间DP 经典括号配对)
2015-07-16 15:14
603 查看
题意略。
思路:
设dp[i][j]为区间i到j的regular brackers的最大长度。
状态转移方程:
如果a[i]和a[j]配对,那么dp[i][j] = dp[i+1][j-1] + 2;
dp[i][j] = max(dp[i][j],dp[i][k] + dp[k+1][j]);
我的代码:
思路:
设dp[i][j]为区间i到j的regular brackers的最大长度。
状态转移方程:
如果a[i]和a[j]配对,那么dp[i][j] = dp[i+1][j-1] + 2;
dp[i][j] = max(dp[i][j],dp[i][k] + dp[k+1][j]);
我的代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn = 105; char s[maxn]; int n,dp[maxn][maxn]; bool match(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)){ if(s[0] == 'e') break; n = strlen(s); memset(dp,0,sizeof(dp)); for(int i = n-1 ; i >= 0 ; i--){ for(int j = i; j < n ; j++){ if(match(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+1][j]); } } printf("%d\n",dp[0][n-1]); } return 0; }
相关文章推荐
- wireshark在window8系统下无法显示wlan网卡无法抓包解决办法
- linux系统启动过程
- C/C++中extern关键字详解
- [数学]两种组合数学公式及其比较
- Mongodb系列:初识Mongodb
- Schedule Tasks on Linux Using Crontab
- jquery返回顶部
- Android Studio 简介
- 数学基础知识——三线插值
- cocos2d-x游戏实例(21)-纵版射击游戏(8)
- cocos2d-x游戏实例(20)-纵版射击游戏(7)
- Android之GetInstance()
- 云计算和大数据时代网络技术揭秘(七)大二层网络
- GRE写作必备句型
- 博客收藏 ios编程
- ViewPager切换动画PageTransformer的使用
- PAT (Basic Level) Practise (中文)1016. 部分A+B (15)
- iOS深入学习(再谈block)
- poj 1426 Find The Multiple
- cocos2d-x游戏实例(19)-纵版射击游戏(6)