本题用了string类型中的substr函数:
用法:s.substr(起点,长度);
- 本题需特别注意数据大小要开long long
- 注意动态规划时状态的继承 dp[i]=dp[i-1];
- 注意特别讨论 i3、i5、i==9的情况,不讨论的话牛客上可以通过,但是用vs无法运行出正确答案
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
#define ll long long
ll dp[330000];
string s;
ll n,a,b,c;
int main()
{
cin>>n>>a>>b>>c;
cin>>s;
ll ans=0;
for(int i=3;i<n;i++)
{
dp[i]=dp[i-1];
if(s.substr(i-3,4)=="nico") dp[i]=max(dp[i],(i==3?dp[i-3]:dp[i-4])+a);
if(i>=5&&s.substr(i-5,6)=="niconi") dp[i]=max(dp[i],(i==5?dp[i-5]:dp[i-6])+b);
if(i>=9&&s.substr(i-9,10)=="niconiconi") dp[i]=max(dp[i],(i==9?dp[i-9]:dp[i-10])+c);
}
cout<<dp[n-1]<<endl;
return 0;
}