题目描述

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

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

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

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

输入格式

第一行两个整数 n,kn,kn,k。
第二行,nnn 个整数 c1,c2,...,cnc_1,c_2,...,c_nc​1​​,c​2​​,...,c​n​​ 表示花色,满足 1≤ci≤k1\leq c_i\leq k1≤c​i​​≤k。
第三行,nnn 个整数 v1,v2,...,vnv_1,v_2,...,v_nv​1​​,v​2​​,...,v​n​​ 表示点数。

输出格式

输出一行一个整数,表示最多能得到的分数。

样例

样例输入 1

7 3
1 2 1 2 3 2 3
1 2 1 2 3 2 3

样例输出 1

13

样例解释 1

第 1 步,向队列加入 111。现在的队列:111
第 2 步,向队列加入 222。现在的队列:1,21,21,2
第 3 步,向队列加入 111。现在的队列:1,2,11,2,11,2,1
第 4 步,向队列加入 222,取出 2,1,22,1,22,1,2。现在的队列:111
第 5 步,向队列加入 333。现在的队列:1,31,31,3
第 6 步,向队列加入 222。现在的队列:1,3,21,3,21,3,2
第 7 步,向队列加入 333,取出 3,2,33,2,33,2,3。现在的队列:111

样例输入 2

18 5
5 2 3 5 1 3 5 2 1 4 2 4 5 4 1 1 1 5
8 2 7 6 10 8 10 9 10 2 4 7 7 7 7 9 7 3

样例输出 2

123

数据范围与提示

对于 100%100\%100% 的数据,1≤n≤106,1≤k≤106,1≤vi≤1091\leq n\leq 10^6,1\leq k\leq 10^6,1\leq v_i\leq 10^91≤n≤10​

6​​,1≤k≤10​6​​,1≤v​i​​≤10​9​​。

题意 :类似于“拉火车”游戏,不过不太一样的是当出现相同的情况后你可以选择拉或者不拉,

思路分析 : 一看就是个 dp ,

      dp[i] = dp[i-1]

      dp[i] = max(dp[i], dp[j-1]+sum[i]-sum[j-1]) , i 与 j 为花色相同的地方

      第一次写的时候就类似纯暴力的了,每次转移的时候从前面所有相同的地方转移,用 vector 存的,超时.... 后面发现 转移方程中的式子是可以优化的,每次找 dp[j-1]-sum[j-1]中最大的转移即可

代码示例 :

#define ll long long
const ll maxn = 1e6+5; ll n, k;
ll c[maxn], v[maxn];
ll sum[maxn], dp[maxn];
ll color[maxn]; void solve() {
memset(color, 0x8f, sizeof(color));
for(ll i = 1; i <= n; i++){
dp[i] = dp[i-1];
dp[i] = max(dp[i], sum[i]+color[c[i]]);
color[c[i]] = max(color[c[i]], dp[i-1]-sum[i-1]);
}
printf("%lld\n", dp[n]);
} int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout); cin >> n >> k;
for(ll i = 1; i <= n; i++) {
scanf("%lld", &c[i]);
}
for(ll i = 1; i <= n; i++) {
scanf("%lld", &v[i]);
sum[i] = sum[i-1]+v[i];
} solve();
return 0;
}

借助 dp 公式去优化的更多相关文章

  1. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

  2. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  3. dp的斜率优化

    对于刷题量我觉得肯定是刷的越多越好(当然这是对时间有很多的人来说. 但是在我看来我的确适合刷题较多的那一类人,应为我对知识的应用能力并不强.这两天学习的内容是dp的斜率优化.当然我是不太会的. 这个博 ...

  4. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  5. DP的四边形优化

    DP的四边形优化 一.进行四边形优化需要满足的条件 1.状态转移方程如下: m(i,j)表示对应i,j情况下的最优值. w(i,j)表示从i到j的代价. 例如在合并石子中: m(i,j)表示从第i堆石 ...

  6. CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】

    问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...

  7. 1393 0和1相等串 鸽笼原理 || 化简dp公式

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1393 正解一眼看出来的应该是鸽笼原理.记录每个位置的前缀和,就是dp[i ...

  8. Codevs 3002 石子归并 3(DP四边形不等式优化)

    3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...

  9. [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)

    [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列) 题面 两个人玩游戏,共进行t轮,每人每轮从[-k,k]中选出一个数字,将其加到自己的总分中.已 ...

随机推荐

  1. 浅谈集合框架二 List、Set常用方法

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  2. 140种Python标准库、第三方库和外部工具

    导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连 ...

  3. visualStudio 无法登陆

    如果遇到 visualStudio 无法登陆,可以看下我的方法,可能有用 尝试关闭代理 打开设置.网络.代理,关了它,试试 如果遇到下面的问题: 我们无法刷新此账户的凭据 No home tenant ...

  4. 小程序 scroll-view 左右横向滑动没有效果(无法滑动)问题

    scroll-view 中的需要滑动的元素不可以用 float 浮动:

  5. Postman:非专业的并发测试

    Postman是开发中常用的接口测试工具,也可以用来进行并发测试. 使用方法如下: 1. 直接输入url 选择GET方法,点击Send. 结果打印一个"test",如下: 2. 使 ...

  6. H3C设置时间--用户视图下

    <H3C>clock datetime ?   TIME  Specify the time (HH:MM:SS) <H3C>clock datetime 19:29:00 ? ...

  7. Vue+node.js实现一个简洁的个人博客系统

    本项目是一个用vue和node以及mysql实现的一个简单的个人博客系统,整体逻辑比较简单.但是可以我们完整的了解一个项目从数据库到后端到前端的实现过程,适合不太懂这一块的朋友们拿来练手. 本项目所用 ...

  8. 【转载】VS Code 中的代码自动补全和自动导入包

    原文连接:https://maiyang.me/post/2018-09-14-tips-vscode/ VSCode 必须安装以下插件: 首先你必须安装 Golang 插件,然后再给 Go 安装工具 ...

  9. Linux中找不到ifconfig命令的解决方法

    1.ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行i ...

  10. 优雅的使用BeanUtils对List集合的操作

    摘要 在业务员流程的时候,我们在Entity.Bo.Vo层数据间可能经常转换数据,Entity对应的是持久层数据结构(一般是数据库表的映射模型).Bo对应的是业务层操作的数据结构.Vo就是Contro ...