Codeforces 1096 D. Easy Problem(dp)


トピックへのリンク主なアイデア:
文字列が与えられた場合、各文字には独自の重みがあり、文字列を操作できます。各操作は文字を削除できます。コストはこの文字の重みです。サブシーケンスがないことを確認してください " 「ハード」の最小コストはいくつですか?

問題解決のアイデア:
動的プログラミング、dp [i] [sta]は、サブシーケンスstaの最小コストが最初のi文字列に表示されないことを示し、staには4つの値0: "h"、1: "ha"、2があります。 「ハー」、3:「ハード」。
「ハード」ではない4つの文字は、現在の状態には影響しません。
文字の場合:
"h":sta = 0に影響するため、削除する必要があります。
"A":sta = 1に影響します。この 'a'を維持する場合は、前に "h"がないことを確認する必要があります。この 'a'を削除する場合は、前に "ha"がないことを確認して、電流がないことを確認する必要があります。 「は」が存在します。
「R」:sta = 2に影響します。この「r」を保持する場合、前に「ha」がないことを確認し、この「r」を削除する必要があります。前に「har」がないことを確認して、現在「har」がないことを確認する必要があります。存在する。
"D":sta = 3に影響します。この 'd'を維持する場合、前に「har」がないことを確認する必要があります。この「d」を削除し、前に「hard」がないことを確認して、「hard」がないことを確認する必要があります。 「存在する。
最終的な答えはdp [n] [3]です。

問題解決コード:

#include<bits/stdc++.h>
using namespace std;
mt19937 rng_32(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
const int maxn=1e5+10;
ll dp[maxn][4];
char s[maxn];
ll a[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    scanf("%s",s+1);
    for (int i=1;i<=n;i++)
    scanf("%I64d",&a[i]);
    for (int i=1;i<=n;i++)
    {
        for (int j=0;j<4;j++)
        dp[i][j]=dp[i-1][j];
        if (s[i]=='h')
            dp[i][0]=dp[i-1][0]+a[i];
        else if (s[i]=='a')
            dp[i][1]=min(dp[i-1][0],dp[i-1][1]+a[i]);
        else if (s[i]=='r')
            dp[i][2]=min(dp[i-1][1],dp[i-1][2]+a[i]);
        else if (s[i]=='d')
            dp[i][3]=min(dp[i-1][2],dp[i-1][3]+a[i]);
    }
    cout<<dp[n][3];
    return 0;
}
12個のオリジナル記事を公開 いいね1 訪問数327

おすすめ

転載: blog.csdn.net/qq_41818939/article/details/104750454