2020牛客寒假算法基础集训营1——I.nico和niconiconi【DP】

题目传送门


题目描述

“にっこにっこにー” ——nico

nico平时最喜欢说的口头禅是niconiconi~。
有一天nico在逛著名弹幕网站"niconico"的时候惊异的发现,n站上居然有很多她的鬼畜视频。其中有一个名为《让nico为你洗脑》的视频吸引了她的注意。
她点进去一看,就被洗脑了: " n i c o n i c o h 0 n i c o n i c o v v n i c o n i c o G ( v n i c o n i c o n i c o n i c o n i c o n i c o G ( v n i c o n i c o . . . . . . " "niconicoh0niconico*^vvniconicoG(vniconiconiconiconiconicoG(vniconico......"
弹幕中刚开始有很多“nico1 nico2”等计数菌,但到后面基本上都是“计数菌阵亡”的弹幕了。
nico也想当一回计数菌。她认为:“nico” 计 a a 分,“niconi” 计 b b 分,“niconiconi” 计 c c 分。
她拿到了一个长度为 n n 的字符串,请帮她算出最大计数分数。
注:已被计数过的字符不能重复计数!如"niconico"要么当作"nico"+“nico"计 2 a 2a 分,要么当作"niconi”+"co"计 b b 分。


输入描述:

第一行四个正整数 n , a , b , c n,a,b,c ( 1 < = n < = 300000 , 1 < = a , b , c < = 1 0 9 ) (1<=n<=300000,1<=a,b,c<=10^9)
第二行是一个长度为 n n 的字符串。


输出描述:

一个整数,代表最大的计数分数。


输入

19 1 2 5
niconiconiconiconi~


输出

7


说明

“niconi"co"niconiconi”~
故为2+5=7分


题解

  • 计 dp[i]dp[i] 代表前 ii 个字符的计数最大值。
    那么可得转移方程:

  • i f ( s u b s t r i n g ( i 3 , i ) = = n i c o ) if(substring(i−3,i)==nico) t h e n then d p [ i ] = m a x ( d p [ i ] , d p [ i 4 ] + a ) dp[i]=max(dp[i],dp[i-4]+a)

  • i f ( s u b s t r i n g ( i 5 , i ) = = n i c o n i ) if(substring(i−5,i)==niconi) t h e n then d p [ i ] = m a x ( d p [ i ] , d p [ i 6 ] + b ) dp[i]=max(dp[i],dp[i-6]+b)

  • i f ( s u b s t r i n g ( i 9 , i ) = = n i c o n i c o n i ) if(substring(i−9,i)==niconiconi) t h e n then d p [ i ] = m a x ( d p [ i ] , d p [ i 10 ] + c ) dp[i]=max(dp[i],dp[i-10]+c)

  • 最后输出 d p [ n ] dp[n] 即可。


AC-Code

#include <bits/stdc++.h>
using namespace std;
#define ll long long

const int maxn = 3e5 + 50;

ll dp[maxn];
int main() {
	int n, a, b, c;
	while (cin >> n >> a >> b >> c) {
		string s;	cin >> s;
		for (int i = 3; i < n; i++) {
			dp[i] = dp[i - 1];
			if (i - 3 >= 0 && s.substr(i - 3, 4) == "nico")
				dp[i] = max(dp[i], dp[i - 3] + a);
			if (i - 5 >= 0 && s.substr(i - 5, 6) == "niconi")
				dp[i] = max(dp[i], dp[i - 5] + b);
			if (i - 9 >= 0 && s.substr(i - 9, 10) == "niconiconi")
				dp[i] = max(dp[i], dp[i - 9] + c);
		}
		cout << dp[n - 1] << endl;
	}
}
发布了157 篇原创文章 · 获赞 99 · 访问量 9822

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/104175238