hihocoder-1300 展胜地的鲤鱼旗(dp)

展胜地的鲤鱼旗

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

岩手县北上市的「北上市立公园展胜地」,是陆奥国三大樱花名所之一。每年的四月中旬到五月初,这里都会举办盛大的祭奠。除了可以在盛开的樱花步道上乘坐观光马车徐行、还有横跨北上川上的鲤鱼旗,河畔还有当地特有的为祭奠祖先而编创的北上鬼剑舞。

假设,我们用一个包含 ‘(‘, ‘)‘的括号字符串来区别每面鲤鱼旗的方向。一段括号序列被称为合法的,当且仅当满足两个条件:一、对于整个序列,左括号数量等于右括号;二、对于任意前缀,左括号的数目都不小于右括号的数目。岛娘想知道,对于一串括号字符串,有多少子串是合法的,你能帮助她么。

输入

输入数据仅一行,包含一个长度为 n (1 ≤ n ≤ 106) 的括号字符串。

输出

输出一行,表示合法的括号子串的数目。

样例输入
(()())
样例输出
4

AC代码:
#include <bits/stdc++.h>
using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
const LL mod=1e9+7;
const double PI=acos(-1.0);
const int inf=0x3f3f3f3f;
const int N=2e6+5;
int n,a[N],dp[N],sum,qu[N];
char str[N];
int main()
{
    scanf("%s",str);
    int len=strlen(str);
    Riop(len)
    {
        if(str[i]==‘(‘)a[i+1]=1;
        else a[i+1]=-1;
    }
    LL ans=0;
    sum=0;
    Riep(len)
    {
        if(a[i]>0)
        {
            sum++;
            qu[sum]=i;
        }
        else
        {
            if(sum>0)
            {
                dp[i]=dp[qu[sum]-1]+1;
                sum--;
                ans+=(LL)dp[i];
            }
        }
    }
    cout<<ans<<"\n";
    return 0;
}

时间: 2024-10-03 14:06:12

hihocoder-1300 展胜地的鲤鱼旗(dp)的相关文章

hihoCoder 1300 展胜地的鲤鱼旗 (括号匹配问题 dp)

#1300 : 展胜地的鲤鱼旗 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 岩手县北上市的「北上市立公园展胜地」,是陆奥国三大樱花名所之一.每年的四月中旬到五月初,这里都会举办盛大的祭奠.除了可以在盛开的樱花步道上乘坐观光马车徐行.还有横跨北上川上的鲤鱼旗,河畔还有当地特有的为祭奠祖先而编创的北上鬼剑舞. 假设,我们用一个包含 '(', ')'的括号字符串来区别每面鲤鱼旗的方向.一段括号序列被称为合法的,当且仅当满足两个条件:一.对于整个序列,左括号数量等于右括

hihocoder 20 展胜地的鲤鱼旗

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 岩手县北上市的「北上市立公园展胜地」,是陆奥国三大樱花名所之一.每年的四月中旬到五月初,这里都会举办盛大的祭奠.除了可以在盛开的樱花步道上乘坐观光马车徐行.还有横跨北上川上的鲤鱼旗,河畔还有当地特有的为祭奠祖先而编创的北上鬼剑舞. 假设,我们用一个包含 '(', ')'的括号字符串来区别每面鲤鱼旗的方向.一段括号序列被称为合法的,当且仅当满足两个条件:一.对于整个序列,左括号数量等于右括号:二.对于任意前缀,左括号的数

题目2 : 展胜地的鲤鱼旗 (hihoCoder挑战赛20 )

题目2 : 展胜地的鲤鱼旗 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 岩手县北上市的「北上市立公园展胜地」,是陆奥国三大樱花名所之一.每年的四月中旬到五月初,这里都会举办盛大的祭奠.除了可以在盛开的樱花步道上乘坐观光马车徐行.还有横跨北上川上的鲤鱼旗,河畔还有当地特有的为祭奠祖先而编创的北上鬼剑舞. 假设,我们用一个包含 '(', ')'的括号字符串来区别每面鲤鱼旗的方向.一段括号序列被称为合法的,当且仅当满足两个条件:一.对于整个序列,左括号数量等于右括号:

[HIHO1300]展胜地的鲤鱼旗(栈,dp)

题目链接:http://hihocoder.com/problemset/problem/1300 给一个字符串,只包含'('和')',问存在多少个子串似的括号是匹配的. 匹配规则在题干中描(蒻)述(语)得(文)非常烂! 维护一个栈,栈中保存'('的下标.当遇到')'并且栈非空的时候,说明已经匹配到一对括号.取出栈顶'('的位置idx.并且记录此时状态,dp(i)=dp(idx-1)+1. 1 #include <algorithm> 2 #include <iostream> 3

hihocoder 1323 回文字符串(字符串+dp)

题解: 比较水的题目 dp[i][j]表示[i...j]最少改变几次变成回文字符串 那么有三种转移 dp[i][j] = dp[i+1][j-1] + s[i] != s[j] dp[i][j] = dp[i+1][j] + 1(删除左边的字符,或者在右边添加一个字符与左边匹配) dp[i][j] = dp[i][j-1] + 1(删除右边的字符,或者在左边添加一个字符与右边匹配) #include <iostream> #include <cstring> #include &l

hihocoder 1075 开锁魔法III(置换+DP)

这题先预处理数组有多少个置换,这样的话,每个置换最少要被选到一次,最多就是置换长度的次数,利用这些置换进行DP,和背包一样的,每个置换当成一个物品,选择的概率很容易算出,利用这点进行状态转移即可算出种数,最后在除上总情况数就可以算出概率 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N

HihoCoder - 1636 Pangu and Stones(区间DP)

有n堆石子,每次你可以把相邻的最少L堆,最多R堆合并成一堆. 问把所有石子合并成一堆石子的最少花费是多少. 如果不能合并,输出0. 石子合并的变种问题. 用dp[l][r][k]表示将 l 到 r 之间的石子合并成 k 堆. 显然是k == 1 时,合并才是需要花费代价的.k >= 2时转移的时候不需要加代价. 这个我当时非常不理解.然后后来想想确实是这样的.因为k >= 2的状态必然是由 k == 1的时候转移过来的. 就是说将[l, r]分成k堆,必然要有几堆合并成一堆. 同理,合并区间长

hihoCoder挑战赛20

1. 因为思念新宿的"小姐姐"们,岛娘计划6月份再去一趟东京,不过这次看来她需要自掏腰包.经过了几天的夜战,岛娘终于在体力耗尽之前,用Python抓下了所有6月份,上海至东京的全部共 n 张机票.现在请你帮助债台高筑的岛娘筛选出符合时间区间要求的,最贵的机票. 输入 输入数据的第一行包含两个整数 n,?m(1?≤?n,?m?≤?105),分别表示机票的总数,和询问的总数.接下来的 n 行,每行两个整数 t,?v (1?≤?t,?v?≤?105),表示每张机票出发的时间和价格. 接下来的

HDU 2859&mdash;Phalanx(DP)

Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Today is army day, but the servicemen are busy with the phalanx for the celebration of the 60th anniversary of the PRC. A phalanx is a matrix of size n*n, each e