updata on 2020.3.19

往博客园搬的时候看了看自己以前写的blog

其实没多久,才两个多月,感觉自己之前写的东西好罗嗦啊。。

但也是最近写的blog才开始多起来

当然现在也没好到哪去。。。

CF1286A题解

整理博客的时候改了一下分类标签,重新审核一下

dp

觉得这题作为一个C比div2的B要简单点吧,算是找回点dp的信心。。。

首先可以想到,只需关心每个数的奇偶,具体是几不用记录

所以\(0\)表示偶数,\(1\)表示奇数,\(-1\)表示不确定,存在\(a[]\)中

\(num[0/1]\)表示一共有几个偶/奇数需要填

状态:

\(f[i][o][j][0/1]\): 考虑前\(i\)位,还剩\(o\)个偶数能用,剩\(j\)个奇数能用,第\(i\)位填的是偶数/奇数

初始:

先都设为极大值

  • 第一位填好了:\(f[1][num[0]][num[1]][a[1]]=0\)
  • 第一位需要自己填: \(f[1][num[0]-1][num[1]][0]=f[1][num[0]][num[1]-1][1]=0\),要判断\(num[0]\)和\(num[1]\)是否大于0

转移:

  • \(i\)位填好了:

    直接判断与前一位是否相等,不相等就加一

    \(f[i][o][j][a[i]]=\min(f[i][o][j][a[i]],f[i-1][o][j][1]+(a[i] \neq 1))\)

    \(f[i][o][j][a[i]]=\min(f[i][o][j][a[i]],f[i-1][o][j][0]+(a[i] \neq 0))\)
  • \(i\)位需要自己填:

    分别处理\(i\)位是偶数/奇数,在对应\(i-1\)位是偶数/奇数,共四种。

    容易想出\(i\)位是偶数/奇数时,被转移的状态分别应该\(o+1\)/\(j+1\)(因为记录的是可以可以填进去的偶数/奇数还剩几个,用了一个,当然要从剩余数多一个的状态转移而来)

    \(f[i][o][j][1]=\min(f[i][o][j][1],f[i-1][o][j+1][1])\)

    \(f[i][o][j][1]=\min(f[i][o][j][1],f[i-1][o][j+1][0]+1)\)

    \(f[i][o][j][0]=\min(f[i][o][j][0],f[i-1][o+1][j][0])\)

    \(f[i][o][j][0]=\min(f[i][o][j][0],f[i-1][o+1][j][1]+1)\)

答案:

当然是\(\min(f[n][0][0][1],f[n][0][0][0])\)

 

其实代码中好多取\(\min\)是不需要的,但是为了方便就都写上了懒得想

另外状态可能还能再优化?欢迎评论区指出

 

\(code.\),复杂度\(O(n^3)\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define R register
#define EN printf("\n")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=-1;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return x*y;
}
int n;
int f[106][106][106][2];
int a[106],num[2];
inline void min(int &x,int y){(x>y)&&(x=y);}
int main(){
n=read();
for(R int i=1;i<=n;i++){
a[i]=read();
if(!a[i]){a[i]=-1;continue;}
a[i]&=1;
num[a[i]]++;
}
num[1]=(n&1?n/2+1:n/2)-num[1];num[0]=n/2-num[0];
std::memset(f,0x3f,sizeof f);
if(a[1]==-1){
if(num[0]>0) f[1][num[0]-1][num[1]][0]=0;
if(num[1]>0) f[1][num[0]][num[1]-1][1]=0;
}
else if(a[1]) f[1][num[0]][num[1]][1]=0;
else f[1][num[0]][num[1]][0]=0;
for(R int i=2;i<=n;i++){
if(a[i]!=-1){
for(R int o=num[0];o>=0;o--){
for(R int j=num[1];j>=0;j--)
min(f[i][o][j][a[i]],f[i-1][o][j][1]+(a[i]!=1)),
min(f[i][o][j][a[i]],f[i-1][o][j][0]+(a[i]!=0));
}
continue;
}
for(R int o=num[0];o>=0;o--){
for(R int j=num[1];j>=0;j--){
min(f[i][o][j][1],f[i-1][o][j+1][1]);
min(f[i][o][j][1],f[i-1][o][j+1][0]+1);
min(f[i][o][j][0],f[i-1][o+1][j][0]);
min(f[i][o][j][0],f[i-1][o+1][j][1]+1);
}
}
}
std::printf("%d",std::min(f[n][0][0][1],f[n][0][0][0]));
return 0;
}

题解 CF1286A 【Garland】的更多相关文章

  1. C. Nice Garland Codeforces Round #535 (Div. 3) 思维题

    C. Nice Garland time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. Codeforces 1108D - Diverse Garland - [简单DP]

    题目链接:http://codeforces.com/problemset/problem/1108/D time limit per test 1 secondmemory limit per te ...

  3. Codeforces Round #535 (Div. 3) 题解

    Codeforces Round #535 (Div. 3) 题目总链接:https://codeforces.com/contest/1108 太懒了啊~好久之前的我现在才更新,赶紧补上吧,不能漏掉 ...

  4. Codeforces Round #535(div 3) 简要题解

    Problem A. Two distinct points [题解] 显然 , 当l1不等于r2时 , (l1 , r2)是一组解 否则 , (l1 , l2)是一组合法的解 时间复杂度 : O(1 ...

  5. POJ1759 Garland —— 二分

    题目链接:http://poj.org/problem?id=1759 Garland Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

  6. 【codeforces 758B】Blown Garland

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  7. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  8. Codeforces Round #611 (Div. 3) A-F简要题解

    contest链接:https://codeforces.com/contest/1283 A. Minutes Before the New Year 题意:给一个当前时间,输出离第二天差多少分钟 ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. 33.2 案例:输出指定目录下的所有java文件名(包含子目录)

    package day32_file_文件和目录操作; import java.io.File; public class test_输出指定目录下所有的java文件名 { public static ...

  2. Linq 学习——将List集合作为筛选条件查询数据

    例: A表是一个List集合,B表也是一个List集合 .A与B有一个共同的字段 RecognitionCarCode B表通过RecognitionCarCode去重后拿到两个值{'1','2'}记 ...

  3. Java中都通用文件下载(ContentType、文件头、response、out四步骤)

    Java中都通用文件下载(ContentType.文件头.response.out四步骤) 新浪微博:IT国子监(记得关注噢) http://weibo.com/itguozijian   我们就直接 ...

  4. web.page.regexp用法(全网唯一)

    前言 因为这个东西“web.page.regexp”,差点把自己杀了.一点都不夸张,这将近30度的天气,办公室不开空调,又要闷,还要带着口罩,躁动的很.加上这个鬼东西“web.page.regexp” ...

  5. 360众测考试,weblogic题(CVE-2018-2894)文件上传漏洞

    0x01 漏洞简介 Weblogic管理端未授权的两个页面存在任意上传jsp文件漏洞,进而获取服务器权限. Oracle 7月更新中,修复了Weblogic Web Service Test Page ...

  6. 用Jenkins集成ios项目设置多scheme,同一代码自动输出多个环境包 实现便捷切换API环境

    Jenkins 安装使用参考我的博客http://www.cnblogs.com/zhujin/p/9064820.html Xcode 配置:说明 一个schema 对应一套环境(如生产,测试),一 ...

  7. tomcat查看线程数

    获取tomcat进程pid ps -ef|grep tomcat 统计该tomcat进程内的线程个数 ps -Lf 29295 |wc -l

  8. 多线程高并发编程(5) -- CountDownLatch、CyclicBarrier源码分析

    一.CountDownLatch 1.概念 public CountDownLatch(int count) {//初始化 if (count < 0) throw new IllegalArg ...

  9. B - Fadi and LCM CodeForces - 1285C 质因子

    题目大意很简单,给你一个整数X,让你求a和b,使得max(a,b)尽可能的小,然后打印a,b 题解:想到了质因子分解,也考虑到了暴力,但是觉得暴力的话会TLE,所以打算用贪心做,然后就一直Wa.... ...

  10. .NetCore程序在Linux上面部署的实现

    我们知道.NetCore能够实现跨平台的根本就是内置Kestrel服务器实现请求处理和不同操作系统上反向代理的实现.在windows操作系统上IIS反向代理配置非常简单.但是Linux上就较为麻烦了. ...