#507. 「LibreOJ NOI Round #1」接竹竿

一天,神犇和 LCR 在玩扑克牌。他们玩的是一种叫做“接竹竿”的游戏。

游戏规则是:一共有 张牌,每张牌上有一个花色 和一个点数 ,花色不超过 种。将这些牌依次放入一列牌的末端。若放入之前这列牌中已有与这张牌花色相同的牌,你可以选择将这张牌和任意一张花色相同的牌之间的所有牌全部取出队列(包括这两张牌本身),并得到与取出的所有牌点数和相同的分数。现在已知 LCR 把这 张牌放入队列的顺序,求她最多能得多少分。

输入顺序即为 LCR 放入队列的顺序。即, 表示第 张放入的牌的花色, 表示第 张放入的牌的点数。

请注意,如果你知道类似的纸牌游戏,请尤其仔细地阅读规则,以免因为理解题意错误而出现不必要的问题。

在这里插入图片描述
思路:根据第一个样例写转移方程式。

#include <bits/stdc++.h>
#define rg register
#define ine inline
#define lowbit(x) x&(~x+1)
#define rge(x) R[x]-L[x]+1
#define ChaBuDuo return//差不多
#define Dele 0;//得了
using namespace std;
typedef long long ll;
typedef unsigned int ut;
typedef const int coi;
typedef unsigned long long ul;
inline int rd() {
    int ans = 0, f = 1;
    char ch = getchar();

    while (!isdigit(ch)) {
        if (ch == '-')
            f = -1;

        ch = getchar();
    }

    while (isdigit(ch)) {
        ans = (ans << 3) + (ans << 1) + ch - 48;
        ch = getchar();
    }

    return ans * f;
}
coi lim = 1e6 + 2;
int n, k;
int val[lim], kind[lim];
int lastV[lim], previ[lim];
ll SV[lim];
ll dp[lim];
int main() {
    n = rd(), k = rd();

    for (int i = 1; i <= n; i++)
        kind[i] = rd();

    for (int i = 1; i <= n; i++)
        val[i] = rd(), SV[i] = SV[i - 1] + val[i];

    for (int i = 1; i <= n; i++) {
        lastV[i] = previ[kind[i]];
        previ[kind[i]] = i;
    }

    //一个需要记住的处理技巧!
    //通过这样处理,lastV[i]就记录了上一个与第 i 个卡牌花色相同的卡牌的编号
    //如果是0,那说明它确实事新来的
    for (int i = 1; i <= n; i++) {
        if (lastV[i])
            dp[i] = max(dp[i - 1], max(dp[lastV[i] - 1] + SV[i] - SV[lastV[i] - 1], dp[lastV[i]] + SV[i] - SV[lastV[i]]));
        else
            dp[i] = dp[i - 1];
    }

    printf("%lld", dp[n]);
    ChaBuDuo Dele
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值