nico和niconiconi
题意::"nico" 计 分,"niconi" 计
分,"niconiconi" 计
分。给一字符串问最大价值为多少。
解法:dp【i】前 i 个字符最大价值。
可得转移方程:
(i >= 3 && sub(i-3 , i) == "nico")dp[i] = max(dp[i] , dp[i-3]+a)
(i >= 5 && sub(i-5 , i) == "niconi")dp[i] = max(dp[i] , dp[i-5]+b)
(i >= 9 && sub(i-9 , i) == "niconiconi")dp[i] = max(dp[i] , dp[i-9]+c)
最后输出dp[n-1]即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
ll dp[300010];
int main()
{
ll n , a , b , c ;
cin >> n >> a >> b >> c ;
string s;
cin >> s;
memset(dp , 0 , sizeof(dp));
dp[0] = 0;
for(int i = 1 ; i < n ; i++)
{
dp[i] = dp[i-1];
if(i >= 3 && s.substr(i-3 , 4) == "nico") dp[i] = max(dp[i] , dp[i-3]+a);
if(i >= 5 && s.substr(i-5 , 6) == "niconi") dp[i] = max(dp[i] , dp[i-5]+b);
if(i >= 9 && s.substr(i-9 , 10) == "niconiconi") dp[i] = max(dp[i] , dp[i-9]+c);
}
cout << dp[n-1] << endl;
}

浙公网安备 33010602011771号