CodeForces 5C(DP初步_G题)解题报告

题目链接:http://codeforces.com/problemset/problem/5/C

-----------------------------------------------------------------------------

题意:给一个括号序列,求满足括号匹配的最长子串长度和个数。

思路:用栈记录序列中的左括号位置,每当出现一个右括号,判断栈是否为空,若不为空,用此时右括号的位置i减去最近的左括号位置再+1即可得到串的长度。

注意:()(),在第二个括号之前已经有符合条件的串,要记录左括号之前的位置已经得到的串的长度。

状态转移方程为f[i]=f[t-1]+i-t+1。t表示离i最近的左括号的位置。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int MAXN =1e6+10;
int len[MAXN]={0};
char s[MAXN];
stack<int>sta;
int k = 0;

int main(void){
    scanf("%s",&s);
    int sl = strlen(s);
    int maxl =0;
    int cls=0;
    for(int i=0;i<sl;i++){
        if(s[i]==‘(‘){
            sta.push(i);
        }else{
            if(!sta.empty()){
                k = sta.top();
                sta.pop();
                if(k>0){
                    len[i]=len[k-1]+i-k+1;
                }else{
                    len[i]=i-k+1;
                }
                if(len[i]>maxl){
                    cls = 1;
                    maxl = len[i];
                }else if(len[i]==maxl){
                    cls++;
                }

                //printf("i:%d k:%d len:%d\n",i,k,len[i]);
            }
        }
    }

    if(maxl > 0) printf("%d %d\n",maxl,cls);
    else printf("%d %d\n",0,1);

    return 0;

}

原文地址:https://www.cnblogs.com/caomingpei/p/8385983.html

时间: 2024-10-21 13:57:09

CodeForces 5C(DP初步_G题)解题报告的相关文章

codeforces 505A. Mr. Kitayuta&#39;s Gift 解题报告

题目链接:http://codeforces.com/problemset/problem/505/A 题目意思:给出一个长度不大于10的小写英文字符串 s,问是否能通过在字符串的某个位置插入一个字母,使得新得到的字符串成为回文串. /**************************************(又到自我反省时刻) 做的时候,通过添加一个单位使得长度增加1,找出中点,检验前一半的位置,找出对称位置替换成对应的前一半位置的字符,然后原字符串剩下的部分追加到后面,再判断回文.但是由于

08年acm区域赛北京赛区 部分题解题报告

08年区域赛北京赛区 http://poj.org/searchproblem?field=source&key=Beijing+2008 POJ 3921 Destroying the bus stations 题目还是比较难的,当时的榜似乎只有4/25的通过/提交,其实题目数据很水.学长转换模型写了网络流求最小割,可以AC,不过自己造了个数据推翻了正确性.我写了个很挫的bfs套bfs,外层是最小的删除点数,内层是求最短路,数据很水可以AC.但比较蛋疼的在于bfs耗内存,而且队列中的点数是阶乘

圆锥曲线:椭圆小题解题报告

圆锥曲线:椭圆小题解题报告 注意事项: 由于本人水平有限,部分题目解题方法可能非最优解,如有更好方法欢迎在评论区指正. 部分题目讲解可能过于口语化,导致并不符合官方(人教版教材)的要求,请各位在考试中不要学习,使用正确的,符合要求的用语. 本文中可能存在错别字,望发现者在评论区指正. 本篇博客是为记录本人在完成学校作业的过程中遇到的问题,同时给部分同学作为解题参考用. 本篇博客中绘制图像的工具是geogebra. 1~10题: 1 题目: 已知F~1~,F~2~是椭圆\(x^2/4+y^2/3=

2016.8.27一套简单的题解题报告

一套不错的题,需要相关资料的联系我咯 考试分析: 1.  由于题目的名字加上第一道题没读完时我以为是我最不擅长的treeDP(其实不得不说,树和图上的题我真的是不想写,一般都写不对,上课太不认真,这个弱点要加强训练),我直接跳到了最后一道题,明知考3h还用了30min去分析,不过还是感谢,这30min救了我两道题出来: 这套题的确还是比较简单,后两道题只要认真分析数据都不会有问题,也许是因为暑假切了贪心和递推,我对分析数据比较在行,第三题切完之后还有2h,不过没写高精的我有点慌,打算最后留一点时

POJ 1458(DP初步_B题)解题报告

题目链接:http://poj.org/problem?id=1458 -------------------------------------------------------- 题意:给你两个字符串, 要你求出两个字符串的最长公共子序列长度. 思路: 首先令dp[i][j]==x表示A串的前i个字符和B串的前j个字符的最长公共子序列长度为x. 初始化: dp全为0. 状态转移: IfA[i]==B[j] dp[i][j]= dp[i-1][j-1]+1 else dp[i][j]= ma

SCU 1114(DP初步_A题)解题报告

题目链接:http://acm.scu.edu.cn/soj/problem.action?id=1114 --------------------------------------------------------------------------------- 题意:一个三角形,只能向下或向右下走,要求得到最大值的路线. 思路:从底向上,状态转移方程为f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]. 代码: #include<cstdio> #i

POJ 1321(DP初步_I题)解题报告

题目链接:http://poj.org/problem?id=1321 -------------------------------------------------------- 题意:给定棋盘区域,要求对于k个棋子存在多少种不同的摆放方案 思路:经典dfs,标记行列进行深搜,然后取消标记.循环得到摆放方案的种数 代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostr

Codeforces Round #256 (Div. 2/A)/Codeforces448A_Rewards(水题)解题报告

对于这道水题本人觉得应该应用贪心算法来解这道题: 下面就贴出本人的代码吧: 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 5 int a[3],b[3]; 6 7 int main(void) 8 { 9 int n; 10 int need = 0; 11 int sum1 = 0,sum2 = 0; 12 for(int i=1;i<=3;++i){ 13 scanf("%d&q

CodeForces 612C (STL_A题)解题报告

题目链接:http://codeforces.com/problemset/problem/612/C -------------------------------------------------------------------------------- 题意:有四种括号,按一定顺序出现,问能否完成括号的匹配,如果不能完成,最少更改几个括号能够完成括号匹配.(注意,左括号只能更换为左括号.同理右括号) 思路:本题具有这样的特征,在每次遇到括号的时候,如果不能完成括号的匹配,需要将新遇到