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 -「NOI.AC 省选膜你赛」array
题目 题意简述 维护一个长度为 \(n\) 的序列 \(\{a_n\}\),并给出 \(q\) 个操作: 将下标为 \(x\) 的数修改为 \(y\). 给定 \(l,r,k\),求最大的 \(m ...
- 开源爱好者月刊《HelloGitHub》第 71 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表实践
一.序言 在实际业务中,单表数据增长较快,很容易达到数据瓶颈,比如单表百万级别数据量.当数据量继续增长时,数据的查询性能即使有索引的帮助下也不尽如意,这时可以引入数据分库分表技术. 本文将基于Spri ...
- [数分笔记]问题1.1 T1
题目:非负整数a,b使得为整数,求证这个整数必是某一整数的平方.(1988年第29届国际数学奥林匹克竞赛试题) 证明:设k=,k为非负整数 1°a=b k=2a²/(1+a²)=2-2/(1+a²) ...
- C# 题目
题目 http://blog.zhaojie.me/2011/03/my-interview-questions-for-dotnet-programmers.html 1.考察对常量和自读字段 初始 ...
- Apache Ranger 编译安装部署
1. 概述 Apache Ranger是大数据领域的一个集中式安全管理框架,目的是通过制定策略(policies)实现对Hadoop组件的集中式安全管理.用户可以通过Ranger实现对集群中数据的安全 ...
- 哈工大 信息安全 实验 Snort与单台防火墙联动实验
XX大学XX学院 <网络攻击与防御> 实验报告 实验报告撰写要求 实验操作是教学过程中理论联系实际的重要环节,而实验报告的撰写又是知识系统化的吸收和升华过程,因此,实验报告应该体现完整性. ...
- VSCode空格变成虚点
"editor.renderWhitespace": "all",
- pandas模块篇(终章)及初识mataplotlib
今日内容概要 时间序列 针对表格数据的分组与聚合操作 其他函数补充(apply) 练习题(为了加深对DataFrame操作的印象) mataplotlib画图模块 今日内容详细 时间序列处理 时间序列 ...
- 组合拳 | 本地文件包含漏洞+TFTP=Getshell
文章声明 安全文章技术仅供参考,此文所提供的信息为漏洞靶场进行渗透,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作. 本文所提供的工具仅用于学习,禁止用于其他,未经授权,严禁转载,如需转 ...