> 文章列表 > 【华为OD机试真题 C++】1060 - 翻牌求最大分 | 机试题+算法思路+考点+代码解析

【华为OD机试真题 C++】1060 - 翻牌求最大分 | 机试题+算法思路+考点+代码解析

【华为OD机试真题 C++】1060 - 翻牌求最大分 | 机试题+算法思路+考点+代码解析

文章目录

    • 一、题目
      • 🔸题目描述
      • 🔸输入输出
      • 🔸样例1
    • 二、代码参考
  • 作者:KJ.JK

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
💖系列专栏:华为OD机试真题(C++)

🍂专栏介绍: 华为OD机试真题汇总,使用C++来进行解析解答实现,帮助大家更好的AC题目,分享各种解题思路,让大家更好通过机试,持续更新中,欢迎大家订阅


一、题目


🔸题目描述

给出n个牌数,在-10到100之间,求最大得分。
 
规则如下:连续翻牌,如果选当前牌,则总得分等于上一次翻牌总得分加上当前牌的数字
 
如果当前总得分小于它前三次的总得分的话,那此次不翻牌,并且总得分就等于它前三次的得分。
 
1到3次翻牌数如果小于0的话就取0。
 
例子:1,-5,-6,4,7,2,-2
 
(1) 1大于零翻牌
(2) -5加上1忏0不翻结果为0
(3) -6 加上0小于0不翻结果为0
(4) 4加上0大于0 (1) 翻牌结果为4
(5) 7加上4大于0 (2) 翻牌结果为11
(6) 2加上11大于0 (3) 翻牌结果为13
(7) -2加上14于4 (4)翻牌结果为11


🔸输入输出

输入

 
输出


🔸样例1

输入
1-5-6472-2输出
11

二、代码参考

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;int main() {string input;getline(cin, input);vector<int> nums;size_t pos = 0;while ((pos = input.find(",")) != string::npos) {nums.push_back(stoi(input.substr(0, pos)));input.erase(0, pos + 1);}nums.push_back(stoi(input));int n = nums.size();vector<int> dp(n);for (int i = 0; i < n; i++) {if (i == 0) {dp[0] = max(0, nums[0]);} else if (i < 3) {dp[i] = max(0, dp[i - 1] + nums[i]);} else {int prev_sum = dp[i - 3] + nums[i - 2] + nums[i - 1] + nums[i];dp[i] = max(dp[i - 1] + nums[i], prev_sum);}}cout << dp[n - 1] << endl;return 0;
}

作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习