博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[12/11/19] 折半&倍增思想学习笔记
阅读量:4677 次
发布时间:2019-06-09

本文共 1743 字,大约阅读时间需要 5 分钟。

折半思想和倍增思想不是同一种思想,但思想接近,并且都是优化程序的黑科技。

折半

  即传说中的 \(Meet\) \(in\) \(the\) \(middle\) , 核心思想就是将原问题分成两个或多个部分,分别解决各个部分后合并。

  适用范围 这种思想一般被广泛运用于优雅的暴力,比如暴搜。当然还可以和乘法逆元之类的东西合用.

  (形如 \(a*b*c*d\equiv k(mod\) \(m)\) 的式子可化为\(a*b\equiv k*(c*d)^{-1}(mod\) \(m)\).)

  操作步骤 将一组数据分为两组,分别搜索或暴力求得答案,然后合并答案。合并时通常需要使用排序+双指针排序+二分等算法统计答案。有时并不是平均分配,可以考虑分为较小部分与较大部分,较小部分先暴搜排序,然后较大部分暴搜+二分即可剪枝。或直接分为两个较小部分与一个极小部分,极小部分直接分类讨论。

倍增

  即传说中可以直接求答案也可以用来优化 \(dp\) 的神器,核心思想就是递归计算,对于一个规模为 \(n\) 的问题,求出如适用范围的通式。

  适用范围

\[f(x)=\left\{\begin{aligned}g(f(x-1))\\g(f(\frac x 2))\end{aligned}\right.\]

  其中 \(g(x)\) 为可推递推式。

  操作步骤 求递推式。若优化 \(dp\) 先思考是否可以直接倍增求得 \(f(x)\),再推 \(dp\) 方程。

//bzoj 2165#include
#define ll long longusing namespace std;int T,n,p;bool flag;ll f[70][105][105],g[105][105],t[105][105],ans,m; //f[i][j][k] 记录从第i个房间走2^p步到达j房间最多能走几层 //g[i][j] 记录从i房间走到j房间最多能走几层 inline ll read(){ ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f;}inline void work1(){ for(p=1;p<=log2(m);p++) for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ f[p][i][j]=max(f[p-1][i][k]+f[p-1][k][j],f[p][i][j]); if(i==1&&f[p][i][j]>=m)return; //已经从第一层走到了M以上 }}inline void work2(){ memset(t,0xef,sizeof(t)); for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ t[i][j]=max(t[i][j],f[p][i][k]+g[k][j]); //为了避免走第2^p步刚好跨越了M,所以只需要求出最接近M且小于M的值,再在最后ans++跨越M即可 if(i==1&&t[i][j]>=m)return; } memcpy(g,t,sizeof(g)); //迭代 ans+=1ll<

转载于:https://www.cnblogs.com/alexiswithlucifer/p/11174908.html

你可能感兴趣的文章
Linux下Tomcat重新启动
查看>>
HTML Table to Json
查看>>
Theano 学习笔记(一)
查看>>
1.7 节点进行排序显示
查看>>
web最佳实践
查看>>
spring 集成shiro 之 自定义过滤器
查看>>
验证密码不允许有连续三位重复的正则表达式
查看>>
python 中对list去重
查看>>
Mono Libgdiplus库
查看>>
js模糊查询案例
查看>>
c语言基础知识要点
查看>>
Android模拟器无法上网访问网络失败解决办法
查看>>
node启动时, listen EADDRINUSE 报错;
查看>>
vue学习链接
查看>>
Systemd 初始化进程
查看>>
【C#学习笔记】文本复制到粘贴板
查看>>
Windows store 验证你的 URL http:// 和 https:// ms-appx:/// ms-appdata:///local
查看>>
python全栈开发_day7_字符编码,以及文件的基本读取
查看>>
js 验证码 倒计时60秒
查看>>
C#基础
查看>>