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 -「洛谷 P4449」于神之怒加强版
\(\mathcal{Description}\) Link. 给定 \(k\) 和 \(T\) 组 \(n,m\),对于每组,求 \[\sum_{i=1}^n\sum_{j=1}^m\ope ...
- ssh 主机之间免密配置脚本
文章目录 单向免密 `expect` 免交互 `sshpass` 免交互 相互免密 单向免密 expect 免交互 注意修改脚本内的 your_password 为 远程主机用户的密码 脚本内的 &q ...
- JAVA8学习——Stream底层的实现四(学习过程)
Stream的深入(四) 从更高角度去看一下:类与类之间的设计关系 (借助IDEA的图形处理工具 Ctrl+Alt+U). ReferencePipeline的三个实现的子类: Head Statel ...
- 关于 share 音乐分享官方文档补充
例子 音乐分享 /*--------微信朋友圈--------*/ [shareParams SSDKSetupWeChatParamsByText:@"内容" title:@&q ...
- SpringBoot2.x设置文件上传文件的大小
The field file exceeds its maximum permitted size of 1048576 bytes spring: # 设置文件上传文件大小 servlet: mul ...
- 16进制转字符串得到flag
工业协议分析2 666c61677b37466f4d3253746b6865507a7d
- 01_描述对象_类图(Class Diagram)
1. 作用 用于面向对象软件开发的分析和设计阶段,描述系统的静态结构. 描述类与类.类与接口.接口与接口之间的静态结构和关系,描述系统的结构化设计.最基本的元素:类.接口. 用于应用程序的一般概念 ...
- 图表制作软件哪家强?当属火爆商业智能圈的Smartbi
图表制作软件选择多吗? 相对来说,统计图表制作软件还是很多的.比如常见的百度图说还有wps和excel都是可以制作好看的统计图的.关键就是看是在怎样的业务场景下使用.一般情况下,如果你对Excel足够 ...
- 安装CentOS7出现dracut:/#……time解决办法
当选择install CentOS7以后一会就会出现错误.报错信息:就是dracut:/# ... timeout一大堆.我本来以为是我的启动盘没做好,后来我又重做了好几次都是这问题. 解决 通过搜索 ...
- 基于Redis分布式BitMap的应用
一.序言 在实际开发中常常遇到如下需求:判断当前元素是否存在于已知的集合中,将已知集合中的元素维护一个HashSet,使用时只需耗时O(1)的时间复杂度便可判断出结果,Java内部或者Redis均提供 ...