题目
链接:https://ac.nowcoder.com/acm/contest/3002/I
来源:牛客网
"にっこにっこにー" ——nico
nico平时最喜欢说的口头禅是niconiconi~。
有一天nico在逛著名弹幕网站"niconico"的时候惊异的发现,n站上居然有很多她的鬼畜视频。其中有一个名为《让nico为你洗脑》的视频吸引了她的注意。
她点进去一看,就被洗脑了:“niconicoh0niconico*^vvniconicoG(vniconiconiconiconiconicoG(vniconico…”
弹幕中刚开始有很多“nico1 nico2”等计数菌,但到后面基本上都是“计数菌阵亡”的弹幕了。
nico也想当一回计数菌。她认为:“nico” 计 分,“niconi” 计 分,“niconiconi” 计 分。
她拿到了一个长度为 的字符串,请帮她算出最大计数分数。
注:已被计数过的字符不能重复计数!如"niconico"要么当作"nico"+“nico"计 分,要么当作"niconi”+"co"计 分。
线性dp
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
const int N=3e5+5;
char g[N];
LL f[N];
char A[4]={'n','i','c','o'};char B[6]={'n','i','c','o','n','i'};char C[10]={'n','i','c','o','n','i','c','o','n','i'};
bool check1(int x){
for(int i=0;i<4;i++){
if(g[x+i]!=A[i]){
return false;
}
}
return true;
}
bool check2(int x){
for(int i=0;i<6;i++){
if(g[x+i]!=B[i]){
return false;
}
}
return true;
}
bool check3(int x){
for(int i=0;i<10;i++){
if(g[x+i]!=C[i]){
return false;
}
}
return true;
}
int main(){
int n;
int a,b,c;
cin >> n >> a >> b >> c;
for(int i=0;i<n;i++){
cin >> g[i];
}
for(int i=0;i<=n;i++){
f[i] = max(f[i],f[max(0, i - 1)]);
if(check1(i)){
f[i+4]=max(f[i]+a,f[i+4]);
}
if(check2(i)){
f[i+6]=max(f[i]+b,f[i+6]);
}
if(check3(i)){
f[i+10]=max(f[i]+c,f[i+10]);
}
}
cout << f[n];
}