牛客寒假1-I nico和niconiconi| 字符串 线性dp

题目地址:https://ac.nowcoder.com/acm/contest/3002/I

思路

题解很清楚了

边界dp[0] = 0;

代码

#include<bits/stdc++.h> 
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int maxn=3e5+10;
 
ll dp[maxn];
 
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    string s,t;
    ll n, a, b, c;
    cin >> n >> a>> b >> c;
    s.resize(1);
    s[0] = 'w';
    cin >> t;
    s+=t;
    for (int i=1; i<=n; i++){
        if (i >= 4 && s.substr(i - 3, 4) == "nico")
            dp[i] = max(dp[i], dp[i - 3] + a);
        if (i >= 6 && s.substr(i - 5, 6) == "niconi")
            dp[i] = max(dp[i], dp[i - 5] + b);
        if (i >= 10 && s.substr(i - 9, 10) == "niconiconi")
            dp[i] = max(dp[i], dp[i - 9] + c);
        dp[i] = max(dp[i], dp[i - 1]);
    }
    cout << dp[n] << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fisherss/p/12316793.html