小苯的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;
}

浙公网安备 33010602011771号