POJ 2995 Brackets 区间DP
POJ 2995 Brackets 区间DP
题意
大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配。需要注意的是这里的匹配规则。
解题思路
区间DP,开始自己没想到是区间DP,以为就是用栈进行模拟呢,可是发现就是不大对,后来想到是不是使用DP,但是开始的时候自己没有推出递推关系,后来实在想不出来看的题解,才知道是区间DP,仔细一想确实是啊。
下面就是状态转移方程:
\]
当初知道了转移方程,就自己写代码,可是就是不对,下面有两个代码,一个是错误的,一个是正确的,两个对比看一看原因。
代码实现
//这个是正确的
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+7;
char str[maxn];
int dp[maxn][maxn];
int main()
{
while(scanf("%s", &str))
{
if(strcmp("end", str)==0)
break;
int n=strlen(str);
memset(dp, 0, sizeof(dp));
//下面书写的格式很重要,先算长度为1的区间,然后再算区间为2的区间,以此类推
for(int len=1; len<=n; len++)
{
for(int L=0; L+len<n; L++)
{
int R=L+len;
if((str[L]=='(' && str[R]==')') || (str[L]=='[' && str[R]==']'))
{
dp[L][R]=dp[L+1][R-1]+2;
}
for(int k=L; k<R; k++)
{
dp[L][R]=max(dp[L][R], dp[L][k]+dp[k+1][R]);
}
}
}
printf("%d\n", dp[0][n-1]);
}
return 0;
}
//这个是错误的代码,下面分析主要原因,连样例都过不了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
stack<char> st;
const int maxn=1e4+7;
char str[maxn];
int dp[maxn][maxn];
int main()
{
while(scanf("%s", str))
{
if(strcmp("end", str)==0)
break;
int n=strlen(str);
memset(dp, 0, sizeof(dp));
//下面的代码其实是有点问题的,应该是先算长度全为1的区间段,然后再是长度为2的,以此类推
//为什么要这这样呢,因为下面的max函数中第二项是一个重要的部分
for(int L=0; L<len; L++)
{
for(int R=i+1; R<len; R++)
{
dp[L][R]=dp[L+1][R-1];
if(str[L]=='(' && str[R]==')' || str[L]=='[' && str[R]==']')
{
dp[L][R]+=2;
}
for(int k=L; k<R; k++)
{
//下面的后两项之和应该在计算dp[L][R]之前就应该计算了,但是这里可能没有。
//所以区间DP的书写格式还是有点套路的。
dp[L][R]=max(dp[L][R], dp[L][k]+dp[k+1][R]);
}
}
}
printf("%d\n", dp[0][len-1]);
}
return 0;
}
POJ 2995 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)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给你一个只由 '(' , ')' , '[' , ']' 组成的字符串s[ ], ...
- 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 ...
- Codeforces 508E Arthur and Brackets 区间dp
Arthur and Brackets 区间dp, dp[ i ][ j ]表示第 i 个括号到第 j 个括号之间的所有括号能不能形成一个合法方案. 然后dp就完事了. #include<bit ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
随机推荐
- hihocoder周赛(树的最长距离)
题目4 : 道路建设 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 H 国有 n 座城市和 n-1 条无向道路,保证每两座城市都可以通过道路互相到达.现在 H 国要开始 ...
- R & and &&
https://blog.csdn.net/jining11/article/details/84933110 和C中的&不用,不要用&&,一般情况都是用&表示并且
- Andorid获取状态栏高度
在应用开发中,有时我们需要用代码计算布局的高度,可能需要减去状态栏(status bar)的高度.状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使 ...
- Python3学习笔记(十三):装饰器
装饰器就是一个闭包,它的主要作用是在不改变原函数的基础上对原函数功能进行扩展. 我们先来写一个简单的函数: from time import sleep def foo(): print(" ...
- [CSP-S模拟测试]:城市游戏(图论+DP)
题目传送门(内部题109) 输入格式 第一行,两个整数$n,m$. 接下来$m$行,每行三个整数$u,v,l$,描述了一条道路连接的两个路口的编号以及道路的长度. 输出格式 输出一行一个整数,为所求的 ...
- Zookeeper基础命令操作
转载链接:https://blog.csdn.net/dandandeshangni/article/details/80558383 安装参考链接https://blog.csdn.net/qiun ...
- jsp里面include的静态导入和动态导入的区别
静态导入就是将被导入页面完全融入到导入的页面中:而动态导入只是在servlet里面插入了include方法,导入的这是被导入页面的body标签里面的内容 1.什么是静态导入? 静态导入指的是,将一个外 ...
- windows管理员权限激活
第一步:计算机-右键--管理--选择用户,选择administrator用户--取消勾选:账户禁用 第二步:alt+ctrl+delete,快捷键调出资源管理器--点击切换用户 第三步:显示出现adm ...
- 初学vue 在做项目时遇到的问题与解决办法(使用element组件)(二)
表格每行里都有按钮 <el-table-column prop="option" label="操作" align="center" ...
- 代码实现:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
import java.util.Scanner; //编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n public ...