列表

详情


NC254197. 相邻不同数字的标记

描述

小红拿到了一个数组,每个数字被染成了红色或蓝色。

小红有很多次操作,每次操作可以选择两个相邻的不同颜色的数字标记,并获得它们数字之和的得分。已经被标记的数字无法再次标记。
小红想知道,自己最多能获得多少分。

输入描述

第一行输入一个正整数 n ,代表数组的长度。
第二行输入 n 个正整数 a_i,代表小红拿到的数组。
第三行输入一个仅包含 'R' 和 'B' 的字符串,第 i 个字符为 'R' 代表数组第 i 个数被染成红色,'B'代表被染成蓝色。



输出描述

输出一个整数,表示小红最多能获得的分值。

示例1

输入:

5
1 3 2 6 5
BRRBB

输出:

12

说明:

第一次选择标记第一个数和第二个数,标记的数是1和3。
第二次选择标记第三个数和第四个数,标记的数是2和6。
总得分为1+3+2+6=12

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 56ms, 内存消耗: 2204K, 提交时间: 2023-07-09 21:01:39

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,a[100010],d[100010],i=1;
    cin>>n;
    string b;
    for(;i<=n;)cin>>a[i++];
    cin>>b;
    b=' '+b;
    for(i=2;i<=n;i++)
    {
        d[i]=d[i-1];
        if(b[i]!=b[i-1])
            d[i]=max(d[i],d[i-2]+a[i]+a[i-1]);
        
    }
    cout<<d[n];
 } 

C++(clang++ 11.0.1) 解法, 执行用时: 55ms, 内存消耗: 1812K, 提交时间: 2023-07-21 09:56:50

#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
long long dp[100005];
string s;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>s;
	s=" "+s;
	for(int i=2;i<=n;i++){
		if(s[i]!=s[i-1]){
			dp[i]=max(dp[i-2]+a[i]+a[i-1],dp[i-1]);
		}
		else{
			dp[i]=dp[i-1];
		}
	}
	cout<<dp[n];
} 

pypy3 解法, 执行用时: 171ms, 内存消耗: 34444K, 提交时间: 2023-07-10 18:44:31

n = int(input())
nums = list(map(int, input().split()))
color = input()
f = [0] * (n + 1)
ans = 0
for i in range(1, n):
    f[i] = f[i - 1]
    if color[i] != color[i - 1]:
        f[i] = max(f[i], f[i - 2] + nums[i - 1] + nums[i])
    ans = max(ans, f[i])
print(ans)

Python3 解法, 执行用时: 193ms, 内存消耗: 15932K, 提交时间: 2023-07-09 20:45:18

n = int(input())
a = list(map(int, input().split()))
s = input()
f = [0] * (n)
for i in range(1, n):
    f[i] = f[i - 1]
    if s[i] != s[i - 1]:
        f[i] = max(f[i], f[i - 2] + a[i] + a[i - 1] if i else 0)
print(f[n - 1])

上一题