CF1479B Painting the Array(贪心+DP)
题目大意:给你一个序列,让你提取出一个子序列A,剩余的部分组成子序列B,现定义seg(x)表示把序列x中相邻的相同数合并成一个数后,序列x的长度,分别求seg(A)+seg(B)的最大值和最小值,n=1e5
考场上并没有想出最小值做法,只会最大值的贪心,下考才知道可以DP做??
最大值的贪心:
维护$nxt[i]$表示$a[i]$下一次出现的位置。再模拟构造两个序列的过程,新加进来的数放在序列尾元素的$nxt$较小的序列

1 #include <cmath>
2 #include <queue>
3 #include <vector>
4 #include <cstdio>
5 #include <cstring>
6 #include <algorithm>
7 #define ll long long
8 #define ull unsigned long long
9 #define dd double
10 using namespace std;
11 const int N1=105; const ll inf=0x3f3f3f3f3f3f3f3fll;
12
13 int n;
14 int a[N1],b[N1],c[N1],nxt[N1],la[N1],cntb,cntc;
15
16 int main()
17 {
18 scanf("%d",&n);
19 for(int i=1;i<=n;i++) scanf("%d",&a[i]);
20 int i,j,ans=0;
21 for(i=n;i>=1;i--)
22 {
23 if(!la[a[i]]) la[a[i]]=i, nxt[i]=n+1;
24 else nxt[i]=la[a[i]], la[a[i]]=i;
25 }
26 nxt[0]=n+1;
27 for(i=1;i<=n;i++)
28 {
29 if(a[i]==a[b[cntb]]&&a[i]==a[c[cntc]]){
30 if(b[cntb]>c[cntc]) c[cntc]=i;
31 else b[cntb]=i;
32 }else if(a[i]==a[b[cntb]]){
33 c[++cntc]=i;
34 }else if(a[i]==a[c[cntc]]){
35 b[++cntb]=i;
36 }else{
37 if(a[b[cntb]]==a[c[cntc]]){
38 if(b[cntb]>c[cntc]) c[++cntc]=i; //改小的
39 else b[++cntb]=i;
40 }else{
41 if(nxt[b[cntb]]<=nxt[c[cntc]]) b[++cntb]=i;
42 else c[++cntc]=i;
43 }
44 }
45 }
46 printf("%d\n",cntb+cntc);
47 return 0;
48 }
最小值的DP:
首先一步贪心,把相邻的相同元素都合并,这样新的序列里一定没有相同的相邻元素
题目里把序列划分成$01$序列,我们$DP$每个01or10分界点!
维护$f[i][0/1]$表示第$i$个元素放在$0/1$,第$i-1$个元素放在$1/0$时的答案
也就是$j~i-1$的元素放在一个序列里,再把$i$接在$j-1$所在序列的后面
可得方程$f[i][0/1]=f[j][1/0]+i-j-(a[i]=a[j-1])$
利用前缀和优化成$O(n)$

1 #include <cmath>
2 #include <queue>
3 #include <vector>
4 #include <cstdio>
5 #include <cstring>
6 #include <algorithm>
7 #define ll long long
8 #define ull unsigned long long
9 #define dd double
10 using namespace std;
11 const int N1=100005; const int inf=0x3f3f3f3f;
12
13 int n,nn;
14 int a[N1],b[N1],f[N1][2],mval[N1][2];
15
16 int main()
17 {
18 scanf("%d",&nn);
19 for(int i=1;i<=nn;i++) scanf("%d",&b[i]);
20 for(int i=1;i<=nn;i++) if(b[i]!=b[i-1]) a[++n]=b[i];
21 memset(mval,0x3f,sizeof(mval)); a[0]=-1;
22 // mi[1][0]=f[1][0]=1;
23 f[1][0]=1; f[1][1]=inf;
24 int mf[2]={0,inf};
25 for(int i=2;i<=n;i++)
26 {
27 f[i][0]=min(mval[a[i]][1]+i-1,mf[1]+i);
28 f[i][1]=min(mval[a[i]][0]+i-1,mf[0]+i);
29 mf[0]=min(f[i][0]-i,mf[0]); mf[1]=min(f[i][1]-i,mf[1]);
30 mval[a[i-1]][0]=min(mval[a[i-1]][0],f[i][0]-i);
31 mval[a[i-1]][1]=min(mval[a[i-1]][1],f[i][1]-i);
32 }
33 printf("%d\n",min(f[n][0],f[n][1]));
34 return 0;
35 }
CF1479B Painting the Array(贪心+DP)的更多相关文章
- CF1155D Beautiful Array 贪心,dp
CF115DBeautiful Array 题目大意:给一个有n个元素的a数组,可以选择其中一个区间的所有数都乘上x,也可以不选,求最大子序列和. 如果没有前面的操作,就是只求最大子序列和,我们都知道 ...
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...
- 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp
正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...
- 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp
题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...
- 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp
题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...
- hdu 1257 最少拦截系统【贪心 || DP——LIS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人
P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...
- 贪心+dp
贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...
随机推荐
- Solution -「WC 2022」秃子酋长
\(\mathscr{Description}\) Link. (It's empty temporarily.) 给定排列 \(\{a_n\}\),\(q\) 次询问,每次给出 \([l,r ...
- 【第二十四期】golang 一年经验开发 富途
他们家是按题目来的,从一个小题目慢慢延伸着问,由浅入深,问到你换题为止. 第一题 给了一个网址,解释一下浏览器填入这个网址后发生了什么? TCP为什么要三次握手四次挥手? 502是什么? 如果出现50 ...
- GCC 使用库文件名进行链接
使用 GCC 进行 C/C++ 代码编译时,如果代码中使用到了库函数,需要使用 -l 选项指定该库函数所在的库.如:-lm.-lrt.-lpthread等.这种方式使用的是库的缩写.一个库的文件名如果 ...
- python-利用xlrd模块中读取有合并单元格的excel数据
前言 对于excel中有合并单元格的情况,合并的单元格只能取到第一个单元格的值,合并的单元格后面的单元格内容的值为空,针对这个情况,写了下面一段代码实现, 对单元格进行判断,如果是传入的索引是合并单元 ...
- 部署Nginx网站服务
编译安装Nginx nginx 官方 : http://nginx.org/ yum -y install pcre-devel zlib-devel ##安装相关依赖包 ./configure ...
- 小甲鱼 python——第一课作业!
0: python是脚本语言把?虽然不是很清楚什么是脚本语言就是了.复制一下: 脚本语言(英语:Scripting language)是为了缩短传统的"编写.编译.链接.运行"( ...
- windev的Trigger触发器,能秒SQL吗?
有朋友问,"你是不是在写论文?" (此处请想象个表情)"好吧,论文继续!" SQL中,触发器可以看成是一种特殊的存储过程,使用inserted临时表来建立数据关 ...
- linux中ctrl+c、ctrl+z、ctrl+d区别
转至:https://www.cnblogs.com/jintaoblogs/p/11343623.html 一.ctrl-c 发送 SIGINT 信号(程序终止(interrupt)信号)给前台进程 ...
- 论文解读(GIN)《How Powerful are Graph Neural Networks》
Paper Information Title:<How Powerful are Graph Neural Networks?>Authors:Keyulu Xu, Weihua Hu, ...
- parquet和orc选型以及压缩格式
Hive表压缩功能 除了直接配置MapReduce压缩功能外,Hive的ORC表和Parquet表直接支持表的压缩属性. 但支持的压缩格式有限,ORC表支持None.Zlib.Snappy压缩,默认为 ...