11.23DP进阶总结

例.1 Luogu-P1387最大正方形

按如下复杂度来分析

  • O(n6)
  • O(n5)
  • O(n3)
  • O(n2logn)
  • O(n^2)

O(n6)

最朴素的暴力做法
即使用两重循环枚举左上角端点,再使用两重循环枚举右下角端点,在用两重循环遍历区间内的每一个点,统计个数
有一道题是Luogu-B3724,刚好就是使用六重循环解决,主要代码如下

O(n^5)

由于需要寻找的部分是一个正方形,所以可以不用枚举右下角端点,改用枚举边长,计算右下角位置
即右下角位置横坐标是左上角横坐标+边长-1,纵坐标一样计算
注意:由于右下角可能超出正方形边界,所以当超边界时要直接break,因为再往后会越超越大

O(n^3)

发现一个一个统计太耗费时间了,所以使用二维前缀和优化,注意边界

O(n2logn)

在N^5是发现了一个长度的单调性:
如果长度短的不行,那么长的肯定不行
如果长的可以,那么一定还有更短的
所以二分长度

O(n2)

考虑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[i1][j],dp[i][j1]),dp[i1][j1)+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]

posted @   KK_SpongeBob  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示