我是如何想到用最简单易懂的解法的
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
ll a,b,c;//范围是1e9,但相加就要超,所以用ll
ll f[300010]={0};
char s[300010];
int main(){
scanf("%d%lld%lld%lld",&n,&a,&b,&c);
scanf("%s",s);
//贪心,每一个位置的最大分数
for(int i=1;i<=n;i++){
f[i]=max(f[i],f[i-1]);
if(s[i-1]=='n' && s[i]=='i' && s[i+1]=='c' && s[i+2]=='o'){
f[i+3]=max(f[i+3],f[i-1]+a);
if(s[i+3]=='n' && s[i+4]=='i'){
f[i+5]=max(f[i+5],f[i-1]+b);
if(s[i+5]=='c' && s[i+6]=='o' && s[i+7]=='n' && s[i+8]=='i')
f[i+9]=max(f[i+9],f[i-1]+c);
}
}
}
printf("%lld",f[n]);
return 0;
}
京公网安备 11010502036488号