HDU 3351 Seinfeld(括号匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3351

解题报告:输入一个只有‘{‘跟‘}‘的字符串,有两种操作,一种是把‘{‘变成‘}‘,另一种是‘}‘变成‘{‘,问你要把这个字符串的括号变成合法的最少需要多少次操作。

在刷DP专题,居然有个这个题目,看起来也像是DP,一直在想用DP怎么做,始终没做出来,最后试下直接字符串匹配居然A了。跟普通的字符串匹配的区别就是

在插入‘}‘这个的时候判断一下栈是不是为空,如果栈为空,则把这个‘}‘改为‘{‘再插入,最后判断栈是不是空,如果栈不为空,则剩下的一定都是‘{‘这个,所以只要把一般的

‘{‘这个改成‘}‘这个就可以了,所以还要加上一般的栈长度才是最后答案。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<deque>
 6 using namespace std;
 7 #define maxn 2005
 8 char str[maxn];
 9 int dp[maxn][maxn];
10 int judge(int i,int j)
11 {
12     int tot = 0;
13     if(str[i] != ‘{‘) tot++;
14     if(str[j] != ‘}‘) tot++;
15     return tot;
16 }
17 deque<char> que;
18 int main()
19 {
20 //    freopen("in.txt","r",stdin);
21 //    freopen("out.txt","w",stdout);
22     int kase = 1;
23     while(scanf("%s",str)!=EOF)
24     {
25         int len = strlen(str),ans = 0;
26         if(str[0] == ‘-‘) break;
27         que.clear();
28         for(int i = 0;i < len;++i)
29         {
30             if(str[i] == ‘{‘)
31             que.push_front(str[i]);
32             else
33             {
34                 if(que.empty())
35                 {
36                     que.push_front(‘{‘);
37                     ans++;
38                 }
39                 else que.pop_front();
40             }
41         }
42         if(!que.empty())
43         ans += (que.size()/2);
44         printf("%d. %d\n",kase++,ans);
45     }
46     return 0;
47 }
48 /*        memset(dp,0,sizeof(dp));
49         for(int i = len-1;i >= 0;--i)
50         for(int j = i + 1;j < len;j+=2)
51         {
52             dp[i][j] = 0x7fffffff;
53             if(j == i + 1) dp[i][j] = judge(i,j);
54             else
55             {
56                 dp[i][j] = min(dp[i+1][j-1]+judge(i,j),dp[i][j]);
57                 if(j >= 2)
58                 dp[i][j] = min(dp[i][j-2]+judge(j-1,j),dp[i][j]);
59                 if(i+2 < len)
60                 dp[i][j] = min(dp[i+2][j]+judge(i,i+1),dp[i][j]);
61             }
62         }
63         printf("%d. %d\n",kase++,dp[0][len-1]);
64     }
65     return 0;
66 }*/

HDU 3351 Seinfeld(括号匹配)

时间: 2024-10-09 08:33:32

HDU 3351 Seinfeld(括号匹配)的相关文章

HDU 3351 Seinfeld 宋飞正传(AC代码)水解

题意:这题目的名字和内容完全没关系!给出一个串,串内只有大括号,问经过几次改变可使全部括号合法?改变指的是可以将某一方向的括号变成另一方向. 思路:本来上网搜区间DP出现了这题,结果给水掉了!思路是,利用栈的特点,若出现成对的合法括号,直接删掉,留下那些不合法的成为一串.既然不合法,那么必须改变,既然要改变,至少得1次吧?那就是使两个非法括号(这里指的是两个一半的括号,即左左,右右,右左)成为合法至少需要一次改变,那好!总共需要几次改变?就看剩下来的那些不合法的括号有多少半了,非法的也肯定是偶数

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

题目1153:括号匹配问题(栈的使用)

题目链接:http://ac.jobdu.com/problem.php?pid=1153 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus // // 1153 括号匹配问题.cpp // Jobdu // // Created by PengFei_Zheng on 08/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio.h>

栈的应用-判断括号匹配

栈的一个典型应用就是可以用来协助分析表达式的括号是否匹配.括号可以延伸到任何成对出现的界定符,例如引号,书名号等. 接下来给出程序实现: 第一部分给出的是堆栈的插入,删除等操作对应的实现: 1 public class StackChar 2 { 3 private int maxSize;//堆栈数组大小 4 private char [] stackArray; 5 private int top;//堆栈顶 6 public StackChar(int maxSize) 7 { 8 thi