题目传送门

相邻不同数字的标记

思路

这是一道入门dp题,看到题目要求是求出最多的分值,那大抵是贪心或dp。

但根据经验,dp更简单,且贪心很可能假。

因此,可得:

dpi,jdp_{i,j} 为前 ii 个的最多分值,jj11 时代表选择第 ii 个,jj00 时则不选第 ii 个。

那么:

dpi,0=max(dpi1,0,dpi1,1)dp_{i,0}=\max(dp_{i-1,0},dp_{i-1,1})

if si1si2 then dpi,1=dpi1,0+ai+ai1if\text{ }s_{i - 1}\ne s_{i - 2}\text{ }then\text{ }dp_{i,1}=dp_{i-1,0}+a_i+a_{i-1}

ans=max(dpn,0,dpn,1)ans=\max(dp_{n,0},dp_{n,1})

Code

using namespace std;
long long n, a[100005], ans = 0;
long long dp[100005][2] = {0};
string s;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    cin >> s;
    for (int i = 2; i <= n; i++)
    {
        if (s[i - 2] != s[i - 1]) dp[i][1] = dp[i - 1][0] + a[i] + a[i - 1];
        dp[i][0] = max(dp[i - 1][1], dp[i - 1][0]);
    }
    cout << max(dp[n][0], dp[n][1]) << endl;
    return 0;
}