动态规划例子:niconiconconiconi,,,,,,

梦想的初衷 提交于 2020-02-05 17:26:27

题目加粗样式
链接
来源:牛客网
知识点:动态规划菜鸡,,,,我真不好解释
动态规划知识点运用链接***加粗样式***

nico平时最喜欢说的口头禅是niconiconi~。
有一天nico在逛著名弹幕网站"niconico"的时候惊异的发现,n站上居然有很多她的鬼畜视频。其中有一个名为
《让nico为你洗脑》的视频吸引了她的注意。
她点进去一看,就被洗脑了:“niconicoh0niconico*^vvniconicoG(vniconiconiconiconiconicoG(vniconico…”
弹幕中刚开始有很多“nico1 nico2”等计数菌,但到后面基本上都是“计数菌阵亡”的弹幕了。
nico也想当一回计数菌。她认为:“nico” 计 分,“niconi” 计 分,“niconiconi” 计 分。
她拿到了一个长度为 的字符串,请帮她算出最大计数分数。
注:已被计数过的字符不能重复计数!如"niconico"要么当作"nico"+“nico"计 分,要么当作"niconi”+"co"计 分。
输入描述:
第一行四个正整数 。
第二行是一个长度为 的字符串。
输出描述:
一个整数,代表最大的计数分数。
示例1
输入
19 1 2 5
niconiconiconiconi~
19 1 2 5
niconiconiconiconi~
输出
7
7
说明
“niconi"co"niconiconi”~
故为2+5=7分
思路:
计数有’a’,‘b’,‘c’,三种方案
由于字符串中都不全为’n’,‘i’,‘c’,‘o’,因此遍历时需要判断是否该部分符合题意,可分别用数组记录每遍历一次所得的计数的值,若不符合则值为前一个的值,且每一次都需要比较,使得到的值为最大的;最后输出该数组的最后以个值
代码展示:

//#include<stdio.h>
//#include<string.h>
#include<iostream>
//#include<bits/stdc++.h>
using namespace std;
long long num[10000000]={0};//用于记录每到一定顺序计数 的值 
string f;
int main()
{
 long long n,a,b,c;
 cin>>n>>a>>b>>c;
 cin>>f;
 for(int i=0;i<n;i++)
 {
  if(i>0)
   num[i]=num[i-1];//当无法计数时,就记录一个前一个计数的值 ,便于最后输出 
  if(i>=3&&f[i]=='o'&&f[i-1]=='c'&&f[i-2]=='i'&&f[i-3]=='n')
   num[i]=max(num[i],num[i-3]+a);
  if(i>=5&&f[i]=='i'&&f[i-1]=='n'&&f[i-2]=='o'&f[i-3]=='c'&&f[i-4]=='i'&&f[i-5]=='n')
   num[i]=max(num[i],num[i-5]+b);//于前一个记nico的进行比较 ,选取大的  
  if(i>=9&&f[i]=='i'&&f[i-1]=='n'&&f[i-2]=='o'&&f[i-3]=='c'&&f[i-4]=='i'&&f[i-5]=='n'&&f[i-6]=='o'&&f[i-7]=='c'&&f[i-8]=='i'&&f[i-9]=='n')
   num[i]=max(num[i],num[i-9]+c);//与前一个记niconi的进行比较,选取大的 
   
 }
 cout<<num[n-1];
 return 0;
 } 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!