NC254197. 相邻不同数字的标记
描述
输入描述
第一行输入一个正整数 ,代表数组的长度。
第二行输入 个正整数 ,代表小红拿到的数组。第三行输入一个仅包含 'R' 和 'B' 的字符串,第 个字符为 'R' 代表数组第 个数被染成红色,'B'代表被染成蓝色。
输出描述
输出一个整数,表示小红最多能获得的分值。
示例1
输入:
5 1 3 2 6 5 BRRBB
输出:
12
说明:
第一次选择标记第一个数和第二个数,标记的数是1和3。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])