poj 2955"Brackets"(区间DP)
https://www.cnblogs.com/violet-acmer/p/9852294.html
题意:
给你一个只由 '(' , ')' , '[' , ']' 组成的字符串s[ ],求最大匹配?
题解:
定义dp[ i ][ j ] : 从第i个字符到第j个字符的最大匹配。
步骤:
(1) : 如果s[ i ] 与 s[ j ]匹配,那么dp[ i ][ j ] = 2+dp[ i+1 ][ j-1 ];反之,dp[ i ][ j ] = 0;
(2) : 接下来,从 i 到 j 将区间划分成两部分[ i , k ]和[ k+1 , j ],( i ≤ k ≤ j-1 ),状态转移方程为
dp[ i ][ j ]=max( dp[ i ][ j ] , dp[ i ][ k ]+dp[ k+1 ][ j ] );
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=+; char s[maxn];
int dp[maxn][maxn]; // (int)'(' = 40,(int)')' = 41;
// (int)'[' = 91,(int)']' = 93;
bool isMatch(int i,int j){//判断s[i]与s[j]是否匹配
return (s[j]-s[i] == || s[j]-s[i] == ) ? true:false;
}
int Solve()
{
int sLen=strlen(s);
int res=;
for(int i=;i < sLen;++i)
{
dp[i][i]=;
dp[i][i+]=(isMatch(i,i+) ? :);
res=dp[i][i+];
}
for(int len=;len <= sLen;++len)//区间长度
{
for(int i=;i+len- < sLen;++i)
{
int j=i+len-;
dp[i][j]=(isMatch(i,j) ? +dp[i+][j-]:);
for(int k=i;k < j;++k)
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+][j]);
res=max(res,dp[i][j]);
}
}
return res;
}
int main()
{
// freopen("C:\\Users\\lenovo\\Desktop\\in.txt\\poj2955.txt","r",stdin);
while(scanf("%s",s) && s[] != 'e')
printf("%d\n",Solve()); return ;
}
分析:
能使用区间DP,必须得满足两个条件:
(1) : 问题具有最优子结构
如果区间对于状态转移方程:dp[ i ][ j ]=max( dp[ i ][ j ] , dp[ i ][ k ]+dp[ k+1 ][ j ] );
如果子结构dp[ i , k ],dp[ k+1 , j ]所求的解为最优解,那么dp[ i , j ]必定也是最优解,反之亦成立。
(2) : 无后效性
区间[ i , j ]的子区间 [ i , k ] 和 [ k+1 , j ] 是通过何种方式取得最优解的并不影响 [ i , j ] 是以何种方式取得最优解
poj 2955"Brackets"(区间DP)的更多相关文章
- HOJ 1936&POJ 2955 Brackets(区间DP)
Brackets My Tags (Edit) Source : Stanford ACM Programming Contest 2004 Time limit : 1 sec Memory lim ...
- poj 2955 Brackets (区间dp基础题)
We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...
- poj 2955 Brackets (区间dp 括号匹配)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- POJ 2955 Brackets 区间DP 入门
dp[i][j]代表i->j区间内最多的合法括号数 if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp[i][j] ...
- POJ 2955 Brackets(区间DP)
题目链接 #include <iostream> #include <cstdio> #include <cstring> #include <vector& ...
- POJ 2955 Brackets 区间DP 最大括号匹配
http://blog.csdn.net/libin56842/article/details/9673239 http://www.cnblogs.com/ACMan/archive/2012/08 ...
- POJ 2995 Brackets 区间DP
POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...
- A - Brackets POJ - 2955 (区间DP模板题)
题目链接:https://cn.vjudge.net/contest/276243#problem/A 题目大意:给你一个字符串,让你求出字符串的最长匹配子串. 具体思路:三个for循环暴力,对于一个 ...
- POJ 2955 Brackets 区间合并
输出一个串里面能匹配的括号数 状态转移方程: if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp ...
随机推荐
- @Autowired 与@Resource的区别(详细)
参考:@Autowired 与@Resource的区别(详细) spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@Pos ...
- DNS_PROBE_FINISHED_NXDOMAIN & MacOS
DNS_PROBE_FINISHED_NXDOMAIN 内网 DNS bug 8.8.8.8 8.8.4.4 # new inner Wi-Fi 10.1.3.10 10.1.3.13 Windows ...
- 《Tensorflow从入门到精通》
第一 开发环境搭建 1. tensorflow的环境搭建 windows下安装cpu版tensorflow: pip install tensorflow 在ubuntu上安装gpu版tensorfl ...
- OSError: mysql_config not found
使用Python3开发一个管理平台,用MySQL数据库存放元数据.使用pip安装mysqlclient模块时出现“OSError: mysql_config not found”错误. 解决: # a ...
- mysql group by 对多个字段进行分组
在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_Selection S ...
- JavaScript的 sourcemap 的理解
当我们在使用vue-cli 开发项目完成后, 就要进行部署,执行npm run build 命令,你会发现它生成.js文件的同时,还会生成一个对应的.map 文件. 当时查了一下, .map 文件的主 ...
- 【数学建模】day09-聚类分析
0. 多元分析之聚类分析. 聚类分析是一种定量方法,从数据的角度,对样本或指标进行分类,进而进行更好的分析. 分为Q型聚类和R型聚类. 1. Q型聚类分析是对样本进行分类.有若干样本,我们把这些样本分 ...
- Codeforces Round #454 Div. 1
B:考虑2*m怎么构造.因为要求相邻的数不能再相邻,容易想到黑白染色之类的东西,考虑染个色然后大概把黑点扔一边白点扔一边.显然m<=3时无解.对m>4,m为偶数时,如1 2 3 4 5 6 ...
- Marriage Match II HDU - 3081(二分权值建边)
题意: 有编号为1~n的女生和1~n的男生配对 首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 然后输入f组,c,d表示编号为c的女生和编号为d的女生是朋友 进行配对的要求满足其一即 ...
- 《App后台开发运维与架构实践》第2章 App后台基础技术
2.1 從App業務邏輯中提煉API接口 業務邏輯思維導圖 功能-業務邏輯思維導圖 基本功能模塊關系 功能模塊接口UML(設計出API) 在設計稿標注API 編寫API文檔 2.2 設計API的要點 ...