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;
}
原文地址:https://www.cnblogs.com/nonames/p/12266413.html