poj2955——括号匹配

题目:http://poj.org/problem?id=2955

区间DP。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char c[105];
int f[105][105];
bool p(char x,char y)
{
	if((x==‘(‘&&y==‘)‘)||(x==‘[‘&&y==‘]‘))return true;
	else return false;
}
int main()
{
	while(1)
	{
		gets(c);
		if(c[0]==‘e‘)return 0;
		memset(f,0,sizeof f);
		int len=strlen(c);
		for(int i=len-1;i>=0;i--)
			for(int j=i+1;j<len;j++)
			{
				for(int k=i;k<=j-1;k++)
					f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);//+
				if(p(c[i],c[j]))
					f[i][j]=max(f[i][j],f[i+1][j-1]+2);
//				printf("%d-%d:%d\n",i,j,f[i][j]);
			}
		printf("%d\n",f[0][len-1]);
	}
}

  

原文地址:https://www.cnblogs.com/Zinn/p/8443328.html

时间: 2024-08-05 03:03:11

poj2955——括号匹配的相关文章

[poj2955]括号匹配(区间dp)

解题关键:了解转移方程即可. 转移方程:$dp[l][r] = dp[l + 1][r - 1] + 2$ 若该区间左右端点成功匹配.然后对区间内的子区间取max即可. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6 #include<iostream> 7 using namesp

poj2955括号匹配 区间DP

类似于上一篇博文. #include<stdio.h> #include<string.h> const int maxn = 120; char s[maxn]; int dp[maxn][maxn]; int max(int x,int y) { return x>y?x:y; } int main() { int i,j,k; while(scanf("%s",s)) { if(strcmp(s,"end")==0) break;

POJ-2955 Brackets(括号匹配问题)

题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brackets sequence, if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and if a and b are regular brackets sequences, th

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为:  

括号匹配问题(顺序栈实现)

本周老师作业留了两个.先上传一个吧.那个有时间我再传上来~ 本周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素和判空操作 括号匹配问题 3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果. 4.程序调试运行并保存输出结果. 5.整理并提交实验作业. 1 #include <cstdio> 2 #include <cstring>

堆栈_括号匹配

class Solution { public: bool isValid(string s) { if(s.empty()) return false; stack<int> s1; int n=s.size(); for(int i=0;i<n;i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') s1.push(s[i]); else if(s1.empty()) return false; else if((s[i]==')'&&s

括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不

动态规划(2)--括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超

行编辑程序、括号匹配检验

行编辑程序.括号匹配检验程序都是利用的栈的数据结构.而这两个 小程序也非常好的显示了栈先进后出的思想.由于程序本身很简短.清晰,所 以也就不做多的解释了,直接上代码了. 行编辑程序: #include<iostream> #include<stack> using namespace std; int main() { stack<char> sta; char ch = getchar(); while(ch!=EOF) { while(ch!=EOF&&am