POJ 2955 Brackets(区间DP, 记忆化搜索)
来源:互联网 发布:眼镜店 知乎 编辑:程序博客网 时间:2024/05/21 19:42
题意:给你一个括号序列(只包括(,),[,],{,} ) , 问你最长的合法子序列多长?
合法情况如下:
()[]{} (()[]) (a)[b] “a,b都是合法序列”
设DP[i][j]表示区间[i,j]有多少个匹配的括号,则所求结果为DP[0,n-1]*2。
转移方程:
DP[i][j] = max{DP[i+1,j], DP[i+1][k-1] + DP[k+1][j] + 1 (str[i]和str[k]匹配,i<k<=j) }
记忆化实现如下:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;string str;int dp[200][200];bool match(int i, int j){ return (str[i]=='('&&str[j]==')')|| (str[i]=='['&&str[j]==']')|| (str[i]=='{'&&str[j]=='}');}int dfs(int l, int r){ int t, ret = 0; if(l >= r) return dp[l][r] = 0; if(dp[l][r] != -1) return dp[l][r]; ret = dfs(l+1, r); for(int i=l+1; i <=r; ++i) { if(match(l,i)) { t = dfs(l+1, i-1) + dfs(i+1, r) + 1; if(t > ret) ret = t; } } return dp[l][r] = ret;}int main(){ while(cin>>str) { if(str[0]=='e') break; memset(dp, -1, sizeof dp ); dfs(0, str.size()-1); cout<<dp[0][str.size()-1] * 2<<endl; } return 0;}
1 0
- POJ 2955 Brackets(区间DP, 记忆化搜索)
- poj 2955 Brackets (区间dp)||(记忆话搜素)
- POJ 2955 Brackets (DP Or 记忆化搜索 总结)
- 149D - Coloring Brackets(区间DP 记忆化搜索)
- Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
- POJ 2955 Brackets (记忆化搜索)
- 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)
- SQL_Server_2005_安装图解
- C++中System()函数的使用及带参数的main函数
- 代码测试之内存越界
- 解压
- TCP/IP详解--接收RST回应的几种情况
- POJ 2955 Brackets(区间DP, 记忆化搜索)
- Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器
- CSS之Position详解
- ZZUOJ 1199: 大小关系
- Tomcat服务器集群与负载均衡实现
- 一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(3)--等级
- VC单文档实现多视图的方法
- Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图
- 重载构造函数(讲解)