
这个用到多状态的线性dp,以往都是一个dp数组,但是这个存在三个dp数组。
cpp
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
long long s[300000];
long long h[300000];
long long y[300000];
int main()
{
int n; cin>>n;
string str;
cin>>str;
s[0]=str[0]=='s'?1:0;
for(int i=1;i<str.size();i++){
if(str[i]=='s') s[i]=s[i-1]+1;
else s[i]=s[i-1];
if(str[i]=='h') h[i]=s[i-1]+h[i-1];
else h[i]=h[i-1];
if(str[i]=='y') y[i]=h[i-1]+y[i-1];
else y[i]=y[i-1];
}
cout<<y[str.size()-1];
}
空间优化后的代码:
cpp
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
long long s;
long long h;
long long y;
int main()
{
int n; cin>>n;
string str;
cin>>str;
s=str[0]=='s'?1:0;
for(int i=1;i<str.size();i++){
if(str[i]=='s') s+=1;
if(str[i]=='h') {h+=s;}
if(str[i]=='y') {y+=h;}
}
cout<<y;
}