【HDU - 5009】Paint Pearls(dp,链表优化dp)

题干:

Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans to color the pearls to make it more fascinating. He drew his ideal pattern of the string on a paper and asks for your help. 

In each operation, he selects some continuous pearls and all these pearls will be painted to their target colors. When he paints a string which has k different target colors, Lee will cost k 2 points. 

Now, Lee wants to cost as few as possible to get his ideal string. You should tell him the minimal cost.

Input

There are multiple test cases. Please process till EOF. 

For each test case, the first line contains an integer n(1 ≤ n ≤ 5×10 4), indicating the number of pearls. The second line contains a 1,a 2,...,a n (1 ≤ a i≤ 10 9) indicating the target color of each pearl.

Output

For each test case, output the minimal cost in a line.

Sample Input

3
1 3 3
10
3 4 2 4 4 2 4 3 2 2

Sample Output

2
7

题目大意:

给n个珍珠,每个珍珠刚开始没有颜色,每次操作可以任选连续的一段珍珠,然后涂上对应的颜色a[i],一次操作的代价是这一段珍珠中的颜色种数的平方。求每个珍珠被都涂色的最小代价。n<=5e4。
例:1 3 3
答:2

解题报告:

考虑dp。首先想到n^2的dp。然后考虑优化。因为每增加一个数字种类数,就要增加平方倍,所以种类数最多就是sqrt(1e5)这么多种类,再往前扫种类就没有意义了,因为还不如直接一个一个涂色。又因为从当前点 i  开始往前扫,数字种类数肯定是单调不减的,所以可以以每一个“颜色种类数”分块,这样有两个好处:一是优化了dp的搜索范围,二是块中的点一定是连续的(因为从后往前种类数单调不减),这也是为什么可以这样维护的原因。

下面考虑维护这些块:

方法1:先对每个数字都建一个块,也就是刚开始是最初的双向链表,发现当扫到第i个数字的时候,如果a[i]之前出现过,那么之前那个位置就没有用了,可以直接删除这个节点,合并对应的前驱和后继即可。也就是说现在链表中的每个数字的位置代表的是对应块的最后一个位置pos,代表的含义是先涂色到pos,然后pos+1一直到 i 用一次涂色。所以对应两个细节:先更新dp值再cnt++;维护链表的时候这样可以做到块的代表元是当前块的最后一个元素。换句话说,这样跳表,每次跳到的pos是 这个数字a[pos] 在后缀中第一次出现的位置。赋初值dp[0]=0别忘了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<list>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int MAX = 2e5 + 5;
int n;
int dp[MAX],a[MAX];
const int UP = 250;
int pre[MAX],ne[MAX];
map<int,int> mp;
int main()
{while(~scanf("%d",&n)) {for(int i = 1; i<=n; i++) scanf("%d",a+i),pre[i] = i-1,ne[i] = i+1,dp[i] = INF;pre[0]=ne[n]=-1;mp.clear();for(int i = 1; i<=n; i++) {if(mp.find(a[i]) == mp.end()) mp[a[i]]=i;else {ne[pre[mp[a[i]]]] = ne[mp[a[i]]];pre[ne[mp[a[i]]]] = pre[mp[a[i]]];mp[a[i]]=i;}int cnt = 1;for(int j = pre[i]; ~j; j=pre[j]) {dp[i] = min(dp[i],dp[j] + cnt*cnt);cnt++;if(cnt > UP) break;}}printf("%d\n",dp[n]);}return 0 ;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动手学无人驾驶(7):车道线检测

最近在研究视觉语义地图&#xff0c;需要进行车道线检测&#xff0c;发现这篇车道线检测论文效果蛮好的 &#xff08;Ultra Fast Structure-aware Deep Lane Detection&#xff09;。论文作者在知乎上已经介绍过了&#xff1a;https://zhuanlan.zhihu.com/p/157530787&#xff…

Coursera自动驾驶课程第16讲:LIDAR Sensing

在第15讲《Coursera自动驾驶课程第15讲&#xff1a;GNSS and INS Sensing for Pose Estimation》 我们学习了自动驾驶定位中常用的两种传感器&#xff1a;IMU&#xff08;惯性测量单元&#xff09; 和GNSS&#xff08;全球导航卫星系统&#xff09;。 本讲我们将学习自动驾驶汽…

DB、ETL、DW、OLAP、DM、BI关系结构图

在此大概用口水话简单叙述一下他们几个概念&#xff1a; &#xff08;1&#xff09;DB/Database/数据库——这里一般指的就是OLTP数据库&#xff0c;在线事物数据库&#xff0c;用来支持生产的&#xff0c;比如超市的买卖系统。DB保留的是数据信息的最新状态&#xff0c;只有一…

Tarjan 算法 常用模板

可以求每个点属于第几个强连通分量&#xff1a;https://blog.csdn.net/dellaserss/article/details/8267192 int Tarjan(int u){int v;dfn[u]low[u]Index;stack[Top]u;Instack[u]1;for(int i0;i<G[u].size();i){vG[u][i];if(!dfn[v]){Tarjan(v);low[u]min(low[u],low[v]);}…

【HDU - 5012】Dice(模拟,bfs)

题干&#xff1a; There are 2 special dices on the table. On each face of the dice, a distinct number was written. Consider a 1.a 2,a 3,a 4,a 5,a 6 to be numbers written on top face, bottom face, left face, right face, front face and back face of dice A. S…

重读经典:《Generative Adversarial Nets》

GAN论文逐段精读【论文精读】这是李沐博士论文精读的第五篇论文&#xff0c;这次精读的论文是 GAN。目前谷歌学术显示其被引用数已经达到了37000。GAN 应该是机器学习过去五年上头条次数最多的工作&#xff0c;例如抖音里面生成人物卡通头像&#xff0c;人脸互换以及自动驾驶中…

一步步编写操作系统 62 函数调用约定

由于我们要将c语言和汇编语言结合编程啦&#xff0c;所以一定会存在汇编代码和c代码相互调用的问题&#xff0c;有些事情还是要提前交待给大家的&#xff0c;本节就是要给大家说下函数调用规约中的那些事儿。 函数调用约定是什么&#xff1f; 调用约定&#xff0c;calling co…

重读经典:《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》

ViT论文逐段精读【论文精读】这次李沐博士邀请了亚马逊计算机视觉专家朱毅博士来精读 Vision Transformer&#xff08;ViT&#xff09;&#xff0c;强烈推荐大家去看本次的论文精读视频。朱毅博士讲解的很详细&#xff0c;几乎是逐词逐句地讲解&#xff0c;在讲解时把 ViT 相关…

【Gym - 101612C】【2017-2018NEERC】Consonant Fencity(状压枚举,预处理)

题干&#xff1a; 把26个字母分成19个辅音字母和7个元音字母&#xff0c;让你通过 将某些字母改为大写状态&#xff0c;使得字符串中连续的两个大小写状态不同的辅音字母组成的字母对数量最多&#xff0c;输出该状态下的字符串。注意输出的字符串中同一字母必须形态统一&#…

浅谈Mysql 表设计规范

本文首先探讨下数据库设计的三大范式&#xff0c;因为范式只是给出了数据库设计的原则&#xff0c;并没有告诉我们实际操作中应该怎样操作&#xff0c;应该注意什么&#xff0c;所以我们还会谈下实际工作中需要注意的具体操作问题。 三大范式 首先放出三大范式内容&#xff0c…

从零开始学视觉Transformer(1):Hello Vision Transformer

Vision Transformer打卡营分享一门很棒的 ViT 课程&#xff0c;课程详细介绍可以看这篇文章&#xff1a; 《Vision Transformer打卡营来啦&#xff01;朱欤博士带你从零玩转ViT爆款模型&#xff01;》

SQLServer中ISNULL、NULLIF和CONVERT函数

效率&#xff1a; UNION和UNION ALL关键字都是将两个结果集合并为一个&#xff0c;但这两者从使用和效率上来说都有所不同。 1、对重复结果的处理&#xff1a;UNION在进行表链接后会筛选掉重复的记录&#xff0c;Union All不会去除重复记录。 2、对排序的处理&#xff1a;Union…

一步步编写操作系统 66 浅析c库函数与系统调用1

本来说好的接下来的工作是要去“丰满”我们的内核&#xff0c;可咱们这种一步一回头的学习方式还得继续啊。其实我了解大家急切写内核的心情&#xff0c;但本书《操作系统真象还原》&#xff08;请大家支持正版&#xff09;的目的不是写一个操作系统就完事了&#xff0c;而是让…

给不会调用C++STL库中二分函数lower_bound,upper_bound,binary_search同学的一些话!

lower_bound算法返回第一个大于等于给定值所在的位置。设置两个指针start和last&#xff0c;其中start指向数组的起始位置&#xff0c;last指向数组末尾位置之后的位置。当start和last指向相同位置时循环结束。mid指向[start,last)区间的中间位置&#xff0c;当中间位置元素值大…

详解IMU标定经典论文:A Robust and Easy to Implement Method for IMU Calibration without External Equipments

本文介绍一篇 关于IMU 标定的经典论文&#xff0c;论文收录于 ICRA14&#xff0c;在论文中作者介绍了如何不适用外部设备标定 IMU 加速度和角速度偏差、尺度系数、轴偏移参数。 论文链接&#xff1a;https://readpaper.com/paper/2021503353、https://readpaper.com/paper/221…

重读经典:《Momentum Contrast for Unsupervised Visual Representation Learning》

MoCo 论文逐段精读【论文精读】这次论文精读李沐博士继续邀请了亚马逊计算机视觉专家朱毅博士来精读 Momentum Contrast&#xff08;MoCo)&#xff0c;强烈推荐大家去看本次的论文精读视频。朱毅博士和上次一样讲解地非常详细&#xff0c;几乎是逐词逐句地讲解&#xff0c;在讲…

【HRBUST - 1623】Relation(思维模拟,拆解字符串)

题干&#xff1a; 一天&#xff0c;ikki在看书的时候发现书上有个类似于家谱状的插图&#xff0c;突然ikki想到了一个有趣的现象&#xff1a;有时候用某个人一连串 的关系描述另一个人的时候&#xff0c;最后可能还是他本身。例如&#xff1a;小明的爸爸的爸爸和小明的爷爷是同…