nico和niconiconi
难度:3星
计 代表前 个字符的计数最大值。
那么可得转移方程:
若取当前子串"nico":
若取当前子串"niconi":
若取当前子串"niconiconi":
最后输出 即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[322222]={0};
string a;
int main(){
ll i,n,x,y,z;
cin>>n>>x>>y>>z;
cin>>a;
for(i=0;i<n;i++){
if(i>0)dp[i]=dp[i-1];
if(i>=3&&a[i-3]=='n'&&a[i-2]=='i'&&a[i-1]=='c'&&a[i]=='o')
dp[i]=max(dp[i],dp[i-3]+x);
if(i>=5&&a[i-5]=='n'&&a[i-4]=='i'&&a[i-3]=='c'&&a[i-2]=='o'&&a[i-1]=='n'&&a[i]=='i')
dp[i]=max(dp[i],dp[i-5]+y);
if(i>=9&&a[i-9]=='n'&&a[i-8]=='i'&&a[i-7]=='c'&&a[i-6]=='o'&&a[i-5]=='n'&&a[i-4]=='i'&&a[i-3]=='c'&&a[i-2]=='o'&&a[i-1]=='n'&&a[i]=='i')
dp[i]=max(dp[i],dp[i-9]+z);
}
//这里偷懒了,对于字符a[i]='n'的情况,显然dp[i]=dp[i-1]。这样就不用处理dp[-1]的值。
cout<<dp[n-1];
}