11.23DP进阶总结
例.1 Luogu-P1387最大正方形
按如下复杂度来分析
- O(\(n^6\))
- O(\(n^5\))
- O(\(n^3\))
- O(\(n^2\log n\))
- O(n^2)
O(\(n^6\))
最朴素的暴力做法
即使用两重循环枚举左上角端点,再使用两重循环枚举右下角端点,在用两重循环遍历区间内的每一个点,统计个数
有一道题是Luogu-B3724,刚好就是使用六重循环解决,主要代码如下
O(n^5)
由于需要寻找的部分是一个正方形,所以可以不用枚举右下角端点,改用枚举边长,计算右下角位置
即右下角位置横坐标是左上角横坐标+边长-1,纵坐标一样计算
注意:由于右下角可能超出正方形边界,所以当超边界时要直接break,因为再往后会越超越大
O(n^3)
发现一个一个统计太耗费时间了,所以使用二维前缀和优化,注意边界
O(\(n^2\log n\))
在N^5是发现了一个长度的单调性:
如果长度短的不行,那么长的肯定不行
如果长的可以,那么一定还有更短的
所以二分长度
O(\(n^2\))
考虑DP
①定义状态:dp[i][j]:表示以(i,j)作为右下角的最长正方形边长
②答案:max(dp[i][j])
③状态转移方程
首先,(i,j)作为右下角,自己就要是1
对于每个(i,j),从(i-1,j-1)直接扩散到(i,j)是不行的,因为还需要(i,j)上面的1数量与(i-i,j-1)相同,左边同理
左边与上面连续1的个数实际上就是上一个格子与左边一个格子的DP值
但是要找三个DP值共有的部分,所以取最小值
得出:
\(dp[i][j]=\min(\min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1)+1\)
④边界
dp[i]][j]=a[i][j]
P5732 【深基5.习7】杨辉三角
还是DP分析
①状态
dp[i][j]:杨辉三角第i行第j列的数
②答案
dp[i][j]
③方程
每个DP值就是他上面的与它左上方的DP和
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
④边界
每行第一个和最后一个是1
dp[i][1]=dp[i][i]=1;
练1 P1130 红牌
实际上可以将任务看作纵,将小组看作横
每次可以向右边,即不换小组或右下,即换小组
发现实际上是Luogu 数字三角形 的改版,只不过有多个起点
定义状态
dp[i][j]:让第i个小组去做第j个步骤,前j个步骤所需的时间最小值
答案
max{dp[i][n]}
方程
对于每一个步骤,可以让上一个小组做上一步或这个小组做上一步
即dp[i][j]=min(dp[i-1][j-1],dp[i][j-1])+a[i][j]
a[i][j]表示第i个小组做第j个步骤所需的时间
边界
每个小组做第一步的时间
dp[i][1]=a[i][1]
11.23DP进阶总结的更多相关文章
- python 基础篇 11 函数进阶----装饰器
11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...
- NodeJS学习笔记 进阶 (11)Nodejs 进阶:调试日志打印:debug模块
个人总结:读完这篇文章需要5分钟,讲解了debug模块的使用 摘选自网络 前言 在node程序开发中时,经常需要打印调试日志.用的比较多的是debug模块,比如express框架中就用到了.下文简单举 ...
- duilib进阶教程 -- 总结 (17)
整个教程的代码下载:http://download.csdn.net/detail/qq316293804/6502207 (由于duilib进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完 ...
- 一个js爬虫
1. 第一个demo 2. configs详解——之成员 3. configs详解——之field 4. configs详解——之site, page和console 5. configs详解——之回 ...
- Java+7入门经典 - 6 扩展类与继承 Part 1/2
第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...
- C++ 编程技巧笔记记录(持续更新)
C++是博大精深的语言,特性复杂得跟北京二环一样,继承乱得跟乱伦似的. 不过它仍然是我最熟悉且必须用在游戏开发上的语言,这篇文章用于挑选出一些个人觉得重要的条款/经验/技巧进行记录总结. 文章最后列出 ...
- Android中WebView使用全解
开始 在Android系统中内嵌的WebKit,这是一个浏览器内核,它帮助着我们可以浏览网页.在实际开发中,如果你想让你的App能够访问网页,那就需要用到WebView这个控件. 如何使用? 其实使用 ...
- Spark实战系列目录
1 Spark rdd -- action函数详解与实战 2 Spark rdd -- transformations函数详解与实战(上) 3 Spark rdd -- transformations ...
- 地区sql
/*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...
- [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...
随机推荐
- Linux mint的hadoop安装方法
参考网址http://www.powerxing.com/install-hadoop/ 1.创建hadoop账户 这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 sh ...
- vscode launch program "xxx" does not exist
Error Solution Please Click The Build Button Other This maybe is the one of Makefile Tools or 'c++ e ...
- 《uTools:提升效率的神奇工具》
utools5.0 一.引言 在如今快节奏的工作和生活中,我们都在寻找能够帮助我们节省时间.提高效率的工具.uTools 就是这样一款令人惊艳的工具,它为我的日常带来了极大的便利. 相关链接:uToo ...
- 奥特曼框架autMan对接微信(千寻、西瓜)框架的详细教程
教程只写常用的两:西瓜.千寻,都运行在windows平台上. 1.千寻对接 文章底部下载千寻微信框架 解压至win电脑 电脑安装微信3.6.0.18并关闭自动更新 运行千寻微信框架 5.千寻框架设置 ...
- Flink - [06] 状态管理
题记部分 一.Flink中的状态 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态. 可以认为状态就是一个本地变量,可以被任务的业务逻辑访问. Flink会进行状态管理,包括状态一 ...
- HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 🔐
title: HTTP协议与RESTful API实战手册(终章):构建企业级API的九大秘籍 date: 2025/2/28 updated: 2025/2/28 author: cmdragon ...
- [解决方案]无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统中禁止执行脚本
前言 windows环境,安装vue-cli 脚手架. 安装成功,但是执行 vue -V 报错了. 报错信息:无法加载文件 C:\Users\Administrator\AppData\Roaming ...
- 近1000 star,Forest 1.5.0 正式版发布
简介 Forest是一个高层的.极简的轻量级HTTP调用API框架. 相比于直接使用Httpclient您不再用写一大堆重复的代码了,而是像调用本地方法一样去发送HTTP请求. 不需要调用HTTP底层 ...
- The selected directory is not a valid home for Go SDK
前言 The selected directory is not a valid home for Go SDK 出现这个错误的原因是 idea 的 Go-plugin 插件,和 Go 的sdk版本不 ...
- go语言中iota和左移<< 右移<<
iota 特殊常量 在go语言中iota比较特殊,是一个被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字就会自动加1 p ...