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 ...
随机推荐
- 高度可配置的 Linux 内存守护程序 Nohang!
导读 Nohang 是一个 Linux 守护程序,也是一个高度可配置的 OOM(内存溢出)阻止工具,适用于 Linux 系统,能够有效地防止内存不足的情况. 部分功能特性 具有良好注释的配置文件,配置 ...
- POJ2763-Housewife Wind-树上单点修改区间求和
这道题可以树链剖分做.但是最近在给学弟搞数据结构复习了LCA树状数组RMQ 然后就搞了一发LCA+树状数组维护. dis数组维护当前点到根节点的权值和.则dis(u,v) = dis[u]+dis[v ...
- ☆ [POJ2411] Mondriaan's Dream 「状压DP」
传送门 >Here< 题意:用1*2的砖块铺满n*m的地板有几种方案 思路分析 状压经典题! 我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数. ...
- Concurrent usage detected
同一个公司里,使用studio 同时进行开发,而且账号还是同一个,会出现这种问题 也有说封掉8732端口就可以解决这个问题的,但是我尝试的是不行的 一直以来用的一个笨的但是有效的办法是:启动studi ...
- 微信小程序原生开发简介
简介: 总结: 1. 逻辑层使用js引擎,视图层使用webview渲染 2. 微信小程序已经支持了绝大部分的 ES6 API 3. 可以自动补全css的兼容语法 文档:https://develope ...
- iptable四表五链
链(内置): PREROUTING:对数据包作路由选择前应用此链中的规则: INPUT:进来的数据包应用此规则链中的策略: FORWARD:转发数据包时应用此规则链中的策略: OUTPUT:外出的数据 ...
- django从零开始-模型
1.设置统计表 配置models.py from django.db import models # Create your models here. # 发布会 class Event(models ...
- 537. Complex Number Multiplication
题目大意: 给出a, b两个用字符串表示的虚数,求a*b 题目思路: 偷了个懒,Python3的正则表达式匹配了一下,当然acm里肯定是不行的 class Solution: def complexN ...
- 「SCOI2014」方伯伯运椰子 解题报告
「SCOI2014」方伯伯运椰子 可以看出是分数规划 然后我们可以看出其实只需要改变1的流量就可以了,因为每次改变要保证流量守恒,必须流成一个环,在正负性确定的情况下,变几次是无所谓的. 然后按照套路 ...
- Crash 的文明世界
题目描述 给一棵树,求以每个点为根时下列式子的值. 题解 当k=1时这就是一个经典的换根dp问题. 所以这道题还是要用换根dp解决. 部分分做法: 考虑转移时是这样的一个形式(图是抄的). 用二项式定 ...