我是如何想到用最简单易懂的解法的
#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; }