利用动态规划思路求解,构建 dp 数组,设置初始值,根据转移状态方程进行遍历,dp[i] 表示字符串 s[:i + 1] 内的最有价值值,则当 i >= 3 时, 若 s[i - 3: i + 1] == "nico" 时,有价值即 dp[i] = max(dp[i], dp[i - 3] + a),当 i >= 5 和 i >= 9 时同理,其他情况 dp[i] 由之前的状态转移得到即 dp[i] = dp[i - 1];代码如下:

n, a, b, c = map(int, input().strip().split())
s = input().strip()
dp = [0 for _ in range(n)]
for i in range(3, n):
    dp[i] = dp[i - 1]
    if i >= 3 and s[i - 3: i + 1] == "nico":
        dp[i] = max(dp[i], dp[i - 3] + a)
    if i >= 5 and s[i - 5: i + 1] == "niconi":
        dp[i] = max(dp[i], dp[i - 5] + b)
    if i >= 9 and s[i - 9: i + 1] == "niconiconi":
        dp[i] = max(dp[i], dp[i - 9] + c)
print(dp[-1])