TB椰程 TypeBuddy 打字搭子

2023-12 · 7级 · 纸牌游戏

GESP 标程 · 考级真题 · 代码 · cpp · 难度 5/5 · 共 1469 字

CCF 原卷官方标程 · 数组与向量、字符串、STL、位运算 · 本地编译通过

  • 2023-12
  • 数组与向量

正文

// GESP 2023-12 C++ 7级 编程题 2 · 纸牌游戏
// 原题:https://oj.yecheng.tv/p/gs2312l7p2
// 官方原卷:https://gesp.ccf.org.cn/101/attach/1584918444376096.pdf
// 题意:你和小杨在玩一个纸牌游戏。
// 知识点:数组与向量、字符串、STL、位运算
// 参考程序:CCF 原卷官方标程,PDF 抽取后已去行号;本地编译核验通过,供打字练习
// 原卷样例验证:样例验证 2/2 通过
//
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int max_n = 1005;
int n;
int a[max_n], b[max_n], c[max_n];
int dp[3][max_n];
int result(int x, int y) {
    if (x == y + 1 || x == y - 2) return 2;
    if (x == y) return 1;
    return 0;
}
int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; ++i) cin >> a[i];
    for (int i = 1; i < n; ++i) cin >> b[i];
    for (int i = 1; i <= n; ++i) cin >> c[i];
    memset(dp, 128, sizeof(dp));
    for (int k = 0; k < 3; ++k){
        dp[k][0] = result(k, c[1]) * a[1];
    }
    for (int i = 2; i <= n; ++i)
        for (int j = i - 1; j >= 0; --j)
            for (int k = 0; k < 3; ++k) {
                int curr_score = result(k, c[i]) * a[i];
                dp[k][j] = dp[k][j] + curr_score;
                if (j > 0) {
                    for (int l = 0; l < 3; ++l) {
                        dp[k][j] = max(dp[k][j], dp[l][j - 1] + curr_score - b[j]);
                    }
                }
            }
    int ans = -2e9, x = 0;
    for (int j = 0; j < n; ++j)
        for (int k = 0; k < 3; ++k) {
            ans = max(ans, dp[k][j]);
        }
    cout << ans << '\n';
    return 0;
}

GESP 标程 · 考级真题的其它内容

打字首页 · 英语学习中心 · 词库画廊 · 编程打字 · 指法入门 · 天梯榜 · 数据分析 · 班级课堂 · 关于我们
椰程 TypeBuddy 打字搭子 —— 键盘指法练习 · 单词记忆 · 班级课堂 · 在线 PK