首页 > 其他分享 >洛谷P10115题解

洛谷P10115题解

时间:2024-01-29 09:44:17浏览次数:25  
标签:le 洛谷 P10115 题解 ll 括号 遍历 美丽 序列

题意简述

给定一个括号序列,求整个序列的美丽值最大。

思维路径

见到序列和权值,很容易想到需要用 DP。

我们定义 \(f[i][j]\) 表示第 \(1\) 到 \(i\) 个括号产生的美丽值最大值,其中 \(j=0\) 表示第 \(i\) 个括号本身不参与美丽值贡献,\(j=1\) 表示第 \(i\) 个括号本身参与美丽值贡献。

接下来分情况讨论。

若 \(j=0\) 说明 \(i\) 本身就不参与美丽值增加,贡献为 \(0\),因此可以得到转移方程 \(f[i][0]=\max_{0\le j \le 1}{f[i-1][j]}\)。

若 \(j=1\) 说明 \(i\) 本身参与美丽值增加,定义产生贡献的括号序列为 \(u\) 到 \(i\),要求这一段括号序列为合法的。定义 \(p[i]\)表示与 \(i\) 匹配的括号,那么 \(u\) 的第一个取值为 \(p[i]\),之后可以通过 \(u=p[u-1]\) 遍历所有可能的转移。由此可以得到转移方程 \(f[i][1]=\max_{0\le j \le 1}{f[u][j]}\)。

实现细节

\(j=1\) 的情况种遍历 \(u\) 的方式仍然是需要较长时间的,我们定义一个数组 \(mx[i]\) 表示 \(i\) 之前可能作为转移的值中的最大值。

假设当前 \(f[i][1]\) 的转移遍历到 \(u\),若 \(mx[u-1]+a[i] \le f[i][1]\),则可以证明此时的 \(f[i][1]\) 一定是最大值,可以停止遍历。

AC 代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=4000009;
const ll INF=1e18+9;
ll n,a[N],f[N][2],p[N],stk[N],nT,mx[N];
string s;

void input(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n;
	cin>>s;
	for(ll i=1;i<=n;i++) cin>>a[i];
}

void solve(){
	for(ll i=0;i<(ll)s.size();i++){
		if(s[i]=='('){
			stk[++nT]=i+1;
		}
		else if(nT>0){
			p[i+1]=stk[nT];
			nT--;
		}
	}
	for(ll i=1;i<=n;i++){
		if(p[i]!=0){
			ll u=p[i];
			while(u){
				f[i][1]=max(f[i][1],max(f[u-1][1],f[u-1][0])+a[i]-a[u]);
				u=p[u-1];
				if(mx[u]+a[i]<=f[i][1]) break;
			}
		}
		mx[i]=max(mx[i-1],f[i][1]);
		f[i][0]=max(f[i-1][1],f[i-1][0]);
		mx[i]=max(mx[i],f[i][0]);
	}
	cout<<mx[n];
}

int main(){
	input();
	solve();
	return 0;
}

标签:le,洛谷,P10115,题解,ll,括号,遍历,美丽,序列
From: https://www.cnblogs.com/lemon-cyy/p/17993846

相关文章

  • B3929 [GESP202312 五级] 小杨的幸运数 题解
    因为一些众所周知的原因,不放代码。分享一种考场思路:\(a\le10^7\),顺序查找肯定会废,所以可以用一种类似埃氏筛的方法将所有满足条件的数标记一下,并将其加入一个答案数组\(a\)当中。然后每次查询只需要用lower_bound函数二分查找一下,假如找到了第\(i\)个:\(a_i=x\),直接......
  • P7324 [WC2021] 表达式求值 题解
    题目链接点击打开链接题目解法不错的题首先建出表达式树说实话我一开始不知道怎么建,但看了代码之后就懂了这里简单说一下:假如要对区间\([l,r]\)建树,分\(E_r=)\)和\(E_r\neq)\)的情况\(E_r=)\),找到匹配的左括号,递归下去建树\(E_r\neq)\),\(r\)可以作为单独的一个......
  • 如何在洛谷看见别人的主页?
    最近洛谷又有点事情了,也不知怎么了。当你想要打开别人的主页时,总是会弹出“系统维护,该内容暂不可见”,这该怎么解决呢?别急,有插件可以帮助你。(以下默认使用edge)篡改猴首先我们需要安装篡改猴,link。LuoguUserContentBlockRemover接着,打开篡改猴,点击“添加新脚本…”,然后删......
  • ABC338D 题解
    赛时怎么连这题都不会。再不练练思维真的就连普及题都不会做了啊。Solution题目来源:ABC338D(inAtcoder|in洛谷)。不妨先考虑应该断掉哪条边。首先我们发现,仅断掉一条边并不会让两个结点不可达,只会让我们从一个结点绕更远的路到达目标结点。如果我们要从结点\(u\)前往结点......
  • CF1070H 题解
    思路我们第一眼看题就发现每个字符串的长度在只有\(8\)。我们需要判断的是某个字符串是不是前面字符串的子串,因为长度太小,所以可以把字符串的每一个子串放到map里,再用一个map判断一个子串是否在当前字符串出现过,出现过就不能重复记。最后在用一个map记录一下每个子串对应......
  • CF1472F 题解
    前言只要题目给了图,你就要画图。思路首先,我们要明确一点:一个矩形,如果里面不存在任何被覆盖的方格,那么这个矩形是绝对可以被覆盖的。如果现在有一个点被覆盖了。那么必定要有一个长方形从这个点下方往后。然后继续在上方接长方形继续往后。直到出现了一个新节点被覆盖。......
  • 第一周题解
    第一周周报这一周是寒假训练的第一周,训练内容主要就是做牛客上的题单还有比赛,牛客上的题单还是比较痛苦的,因为牛客压根看不了测试用例,导致我事后想知道错的例子是什么都看不了。做第一题第二题还有倒数第三题有一两个例子一直都过不去。检查了很久的代码,一直是差一两个例子,就老是......
  • P4145 上帝造题的七分钟 2 / 花神游历各国 题解
    题目链接:上帝造题的七分钟2/花神游历各国差不多的题:[YnoiEasyRound2023]TEST_69注意到对某个点来说暴力单点即为反复的:\(x=\sqrt{x}\),最终为\(1\),根据\(master\)主定理可知,跟\(veb\)树分析差不多的,复杂度为:\(O(\log{\log{V_{max}}})\)。不懂的可以去学学这篇文章。那......
  • 洛谷题解-[ARC001B] リモコン
    https://www.luogu.com.cn/problem/AT_arc001_2题目描述 输入格式无输出格式无题意翻译题目描述:高桥君要调整空调的设定温度。现在的设定温度是A度,而他想调到B度。空调遥控器按一次可以:上调或下调1度上调或下调5度上调或下调10度高桥君想求出从A调到B度的最小......
  • P1197 [JSOI2008] 星球大战 题解
    P1197[JSOI2008]星球大战题解题目链接P1197[JSOI2008]星球大战简要思路看完题目的第一印象是——连通性。图论中判断连通性很容易想到并查集,但是并查集只支持合并和查询,并不支持删除,怎么办呢?考虑逆向思维,把删点的过程倒过来,看成加点和连边,那么此题就可以非常方便的用并......