小苯的ovo2.0

题目链接:https://ac.nowcoder.com/acm/contest/105623/F

题意:

给定一个仅有o,v和?组成的字符串,其中任意一个?可以改变为o或v,求ovo子序列最多能出现多少次

思路:

发现对于ovo子序列的次数,我们只需要看v的贡献即可

v的贡献:左边o的个数 x 右边o的个数
答案就是v的贡献的累和
对一个v而言,它的贡献随着在字符串中移动相当于一个凸函数,即越靠近中间,左o x 右o的结果越大
贪心的想那就要把相对左和相对右的?换成o,相对中间的都换为v

由于这些字符串没有什么特殊性质,所以O(nxnxn)枚举变v的区间,再利用线性dp统计个数即可

string s;
int check(int l,int r){
	string str=s;
	for(int i=0;i<str.size();i++){
		if(str[i]!='?')continue;
		if(i>=l&&i<=r)str[i]='v';
		else str[i]='o';
	}
	int a=0,b=0,c=0;
	for(int i=0;i<str.size();i++){
		if(str[i]=='o'){
			a++;c+=b;
		}else{
			b+=a;
		}
	}
	return c;
}
void solve(){
	cin>>s;
	int ans=0;
	for(int l=0;l<s.size();l++){
		for(int r=l-1;r<s.size();r++){
			ans=max(ans,check(l,r));
		}
	}
	cout<<ans<<endl;
}
posted @ 2025-03-31 18:47  Marinaco  阅读(22)  评论(0)    收藏  举报
//雪花飘落效果