第二题

问题描述

样例输入 1

3 2
*#
#*
##

样例输出 1

2

样例输入 2

4 5
*####
*####
*####
#* * * #

样例输出 2

3

提示

对于20%的数据n,m<=5;
对于50%的数据满足n,m<=500;
对于100%的数据满足2<=n,m<=2000。


题意要求用每次消去正或反的L形的三个格子,消除所有的关键格子,需要的最小步数。
显然每一列只需要关心最上面一个关键格子的位置就行了。
因此令 A[i] A [ i ] A[i]表示第 i i i列最上面一个关键格子是从下往上数的第几个格子。

先考虑暴力的dp,令F[i][j]" role="presentation" style="position: relative;">F[i][j]F[i][j]F[i][j]表示前 i i i列,前i−1" role="presentation" style="position: relative;">i−1i−1i-1列已经消完,第 i i i列还需要消j" role="presentation" style="position: relative;">jjj个格子的最优步数。
那么转移的时候枚举第 i i i列消去了k" role="presentation" style="position: relative;">kkk个反L形,有

F[i][j]=min(F[i−1][k+2(A[i]−j−2k)]+k+A[i]−j−2k) F [ i ] [ j ] = m i n ( F [ i − 1 ] [ k + 2 ( A [ i ] − j − 2 k ) ] + k + A [ i ] − j − 2 k )

F[i][j]=min(F[i-1][k+2(A[i]-j-2k)]+k+A[i]-j-2k)
k+2(A[i]−j−2k) k + 2 ( A [ i ] − j − 2 k ) k+2(A[i]-j-2k)表示消去第 i i i行时,第i−1" role="presentation" style="position: relative;">i−1i−1i-1行会被消去的数量,也可以从 F[i−1] F [ i − 1 ] F[i-1]第二维更小的位置转移过来,但显然不会更优。另外, F[i][A[i]+1]−F[i][n] F [ i ] [ A [ i ] + 1 ] − F [ i ] [ n ] F[i][A[i]+1]-F[i][n]都赋值为 F[i−1][0] F [ i − 1 ] [ 0 ] F[i-1][0]

这个dp是 O(n3) O ( n 3 ) O(n^3)的,需要优化。

考虑一下每次转移时 F[i][j] F [ i ] [ j ] F[i][j]和 F[i][j+1] F [ i ] [ j + 1 ] F[i][j+1]分别在 k k k等于多少时取得最优值,一个结论是F[i][j+1]" role="presentation" style="position: relative;">F[i][j+1]F[i][j+1]F[i][j+1]取得最优值的 k k k一定小于等于F[i][j]" role="presentation" style="position: relative;">F[i][j]F[i][j]F[i][j]取得最优值的k,这个结论脑补一下就能理解。因为需要消去的块变少了,那么相应的操作数一定是不增的。

容易得到 F[i] F [ i ] F[i]是随着j变大而单调不增的。

再观察一下可以发现,在 j j j确定的时候,F[i−1][2A[i]−2j−3k]+A[i]−j−k" role="presentation" style="position: relative;">F[i−1][2A[i]−2j−3k]+A[i]−j−kF[i−1][2A[i]−2j−3k]+A[i]−j−kF[i-1][2A[i]-2j-3k]+A[i]-j-k的取值是单峰的。因为 F[i−1][2A[i]−2j−3k] F [ i − 1 ] [ 2 A [ i ] − 2 j − 3 k ] F[i-1][2A[i]-2j-3k]随k的减小是不增的, A[i]−j−k A [ i ] − j − k A[i]-j-k是单增的,因此它是单峰的。

那么我们得到了一个很好的性质,即 F[i][j] F [ i ] [ j ] F[i][j]的转移是单峰的,并且峰的位置是单调的。
因此我们就可以将枚举k的复杂度变成均摊 O(1) O ( 1 ) O(1)的了。只需要每次记录一下最优的k取值,讨论 j+1 j + 1 j+1时直接从这个最优取值开始,如果 k−1 k − 1 k-1不能更优就 break b r e a k break就行了。

总时间复杂度 O(n2) O ( n 2 ) O(n^2)


代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 2005
using namespace std;
int n,m,F[N][N],A[N];
char map[N][N];
int main()
{int i,j,k,x,id;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("\n%s",&map[i][1]);for(i=1;i<=m;i++){for(j=1;j<=n;j++)if(map[j][i]=='*')break;A[i]=n+1-j;}memset(F,60,sizeof(F));for(i=0;i<=n;i++)F[0][i]=0;for(i=1;i<=m;i++){id=A[i]>>1;for(j=0;j<=A[i];j++){id=min(id,A[i]-j>>1);for(k=id;k>=0;k--){x=k+(A[i]-j-2*k<<1);if(x>A[i-1])x=A[i-1];if(F[i][j]>=F[i-1][x]+A[i]-j-k)id=k,F[i][j]=F[i-1][x]+A[i]-j-k;else break;}}for(j=A[i]+1;j<=n;j++)F[i][j]=F[i-1][0];}printf("%d",F[m][0]);
}

Newnode‘s NOI 模拟赛 第二题 (单调dp)相关推荐

  1. 蓝桥杯|2021第十二届蓝桥杯第二次模拟赛真题与解答[Java]

    记录2021年第十二届蓝桥杯第二次模拟赛真题与解题,部分答案来自网络.个人记录,菜得很. 目录 填空题 一 二 三 四 五 编程题 六 七 八 九 十 填空题 一 问题描述 请问在 1 到 2020 ...

  2. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  3. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  4. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  5. 蓝桥杯模拟赛第二场(web)

    文章目录 蓝桥杯模拟赛第二场(web) 1 卡片化标签页 2 随机数生成器 3 个人博客 4 学生成绩统计 5 水果摆盘 6 给页面化个妆 7 小兔子爬楼梯 8 时间管理大师 9 购物车 10 菜单树 ...

  6. # USACO@2020铜级赛第二题

    USACO@2020铜级赛第二题 题目(摘自usaco.org) Farmer John 的远房亲戚 Ben 是一个疯狂的科学家.通常这会在家庭聚会时造成不小的摩擦,但这偶尔也会带来些好处,尤其是当 ...

  7. 14届蓝桥杯校赛模拟2 第二题

    第二题结果 :2048 #include <bits/stdc++.h>using namespace std;bool jj(int x){for(int i=0;i<6;x> ...

  8. 第十三届蓝桥杯(Web 应用开发)线上模拟赛第一题

    [Bug 调试]修复网站显示问题 特别说明 第十三届蓝桥杯(Web 应用开发)线上模拟赛依托于蓝桥云课线上实验环境打造,可能与正式比赛所使用线下环境有所不同.线上模拟赛侧重于考生了解比赛题型和体验比赛 ...

  9. 信息安全 数据赛 铁人三项_[信息安全铁人三项赛总决赛](数据赛)第二题

    WriteUps 首先根据队友的发现 , 找到了攻击者的 ip : 172.16.10.121 然后这条命令将所有的 http 数据包的请求以及相应全部提取出来 写了一个 Shell 脚本 , 提取完 ...

最新文章

  1. 联想服务器DL388eu盘装系统,服务器价格指导 10月双路机架产品导购
  2. NRF52 UICR寄存器读写
  3. Egret的容器--删除对象,遮罩
  4. 分布式ID-雪花算法
  5. 微服务Springcloud超详细教程+实战(二)
  6. 你都有哪些丢人的经历?
  7. PAT 乙级 1051. 复数乘法 (15) Java版
  8. springboot 循环引用问题
  9. pip 源使用阿里云镜像加速
  10. Security+ 学习笔记13 加密基础
  11. switchHost没有权限修改hosts文件
  12. 【转摘】芯片的本质是什么
  13. 加减法叫做什么运算_加减法的意义及运算定律、性质
  14. 动词记忆(1):ate,ify,ish后缀常用词
  15. [单片机框架][bsp层][AT32F415][bsp_adc] adc配置和使用
  16. Centos7下Docker1.12和Docker-CE 17.12添加镜像加速器的区别
  17. 【商品架构day6】阿里闲鱼亿级商品结构化 - 用技术的力量去降低商户录入成本
  18. 计算机领域的世界之最,超级计算机神威·太湖之光世界最快(中国这五年的世界之最④)...
  19. 生产环境使用 pt-table-checksum 检查MySQL数据一致性
  20. day05数据类型(上)

热门文章

  1. python城市提取_使用python从文本中提取城市名称
  2. 仿iphone 气泡短信 自定义list适配器实现
  3. 【上图开放数据竞赛】中文期刊论文自动分类Baseline
  4. rosbag --clock
  5. 1、计算机可以解决问题的三种途径
  6. 六自由度机械臂建模仿真(matlab程序),有控制面板,标价即为真实价格,代码可流畅运行
  7. 3ds Max基本操作,快捷键等等详细笔记
  8. 设计网页页脚的15个超实用技巧
  9. AES-128-CBC加解密/openssl_decrypt
  10. PCB模块化设计10——PCI-E高速PCB布局布线设计规范