算法竞赛当中的思考方法——方法论篇。

2023-11-19

方法论:万物皆朴素的第一性原理

几乎任何领域的任何问题的解决方案,都可以看作是“某个结构上的朴素方法的优化“。

计算机只能处理规模有限的问题,在给定规模且不考虑效率的情况下,问题一定存在朴素解法。具体手段有直接模拟 / 利用bit枚举 / 各种搜索算法等。
具体方法:从问题到解决方案

一般的问题我们有一般的思考方式,而特殊的问题经过总结可以形成特定的解决方案,供今后调用。这需要长时间的积累。

举出一些算法竞赛中常用的问题——解决方案的思路:

解决方案

若问题具备 ”线性多维逆序“ 结构,则考虑 CDQ分治。

若问题具备 ”元素唯一归属于某集合“ 结构,则考虑并查集。

若问题具备 ”连通性“ 结构,则考虑搜索 / 并查集。

若问题具备 ”记录数据未来使用“,则考虑哈希表。

若问题具备 “FILO / 可规约” 结构,则考虑栈。

若问题具备 ”线性结构上地最远/近最大/小元素“ 结构,则考虑单调栈。

若问题具备 ”FIFO“ 结构,考虑队列。

若问题具备 ”动态维护滑动窗口“ 结构,考虑单调队列。

若问题具备 ”字符串” 结构,则考虑如下做法:
    若问题具备 ”字符串匹配“ 结构,则考虑如下做法:
        若为线性结构,考虑KMP
        若为Trie结构,考虑AC自动机
    若问题具备 ”求最长回文子串” 结构,则考虑Mancher算法。

若问题具备 “某节点只有一个父节点” 结构,考虑树结构的如下做法:
    若问题具备 “树的重心/直径/中心/最近公共祖先” 结构,则按经典算法处理。
    若问题具备 “子树的相同问题” 结构,则考虑递归。
    若问题具备 “子树的相似问题” 结构,则考虑树形Dp。
    若问题具备 “对树的操作在区间上简单” 结构,则考虑 树链剖分 + 区间维护

若问题具备 “序无关 / 要求某种序” 结构,则考虑排序。

若问题具备 “求解难, 但是验证解是否可行容易” 结构,则考虑二分答案。

若问题具备 “最大最小 or 最小最大 or 结果单调性/二分性” 结构,则考虑二分。

若问题具备 “枚举单调性” 结构,则考虑双指针。

若问题具备 “大数计算”,则考虑高精度。

若问题具备 “数据范围大但涉及范围小”,则考虑离散化。

若问题具备 “子问题” 结构,则考虑动态规划。
    若问题具备 ”从1到n符合某些数位限制的个数”,则考虑数位DP
    若动态规划问题具备 “棋盘上联通约束” 结构,则考虑状态压缩dp
    若动态规划问题具备 ”固定长度区间最值“ 结构,则考虑单调队列优化。
    若动态规划问题具备 ”“ 结构,则考虑斜率优化。
    若动态规划问题具备 ”“ 结构,则考虑四边形不等式优化。

若问题具备 “解空间无限 / 有明显优秀策略“ 结构,考虑贪心。

若问题具备 “分块” 结构,则考虑 分块 / 块状链表 / 莫队优化暴力

若问题具备 ”区间性质“ 结构,则考虑以下经典做法:
    特殊地,若该性质是区间 ”选点/分组/覆盖/最大不相交“ 的区间数,则按经典问题处理。
    否则,若该性质具备 ”区间减法 / 区间消去“ 结构,则考虑前缀和 / 差分 / 树状数组 / 线段树 / 平衡树 / 分块。
    否则,若该性质具备 ”区间加法 / 区间合并“ 结构,则考虑线段树 / 平衡树

若问题具备 “状态迁移最少次数” 结构,则考虑最短路算法。

若问题具备 “” 结构,则考虑最小生成树算法。

若问题具备 “把图分成两部分” 结构,则考虑二分图算法。

若问题具备 “把图变成拓扑图” 结构,则考虑强连通分量算法。

若问题具备 “对拓扑图求拓扑序” 结构,则考虑拓扑排序算法。

若问题具备 “对图恰好走一遍” 结构,则考虑欧拉路径和回路算法。

若问题具备 “差分约束” 结构,则考虑图的差分约束算法。

若问题具备 “判环” 结构,则考虑SPFA判环。

若问题具备 ”面积并”,则考虑计算几何面积并。

若问题具备 “最大公约数和最小公倍数“,则考虑gcd。

若问题具备 “进制相关“ 结构,则考虑进制转换。

若问题具备 “质数相关“ 结构,则考虑判定质数/分解质因数/质数筛

若问题具备 ”约数相关” 结构,则考虑所有约数/求约数个数/求约束之和

若问题具备 “欧拉函数相关” 结构,考虑欧拉函数算法

若问题具备 “幂相关” 结构,考虑快速幂

若问题具备 “”溢出long long但是时间限制不严格“ 结构,考虑龟速乘

若问题具备 “矩阵运算相关“ 结构,考虑矩阵计算/矩阵快速幂

若问题具备 ”阶乘计算相关“ 结构,考虑阶乘快速计算

若问题具备 ”线性同余方程“ 结构,考虑扩展欧几里得

若问题具备 “线性方程组相关” 结构,考虑高斯消元

若问题具备 “组合数”,考虑求组合数的四种算法

若问题具备 “容斥” 结构,考虑容斥计算

若问题具备 “博弈论” 结构,考虑博弈论

当然这只是冰山一角,真正的细节还有很多。熟练的Coding是刻意练习的结果。
(另外,算法可以有效防止老年痴呆)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法竞赛当中的思考方法——方法论篇。 的相关文章

随机推荐

  • 商城项目 pc----商品详情页

    目录 vue路由滚动行为 排他思想 放大镜 加入购物车操作 项目实战 Promise 特点 用法 then 执行顺序 拓展 async await Promise优缺点 Promise方法 浏览器缓存 为什么需要本地存储呢 window s
  • 思科路由器IPv6各种路由协议配置

    一 基础配置 R1 Router gt ena Router conf t Router config host R1 R1 config int g0 0 R1 config if ipv add 2001 3 1 64 R1 confi
  • Java多线程(四):什么是死锁以及如何解决死锁

    目录 1 什么是死锁 2 死锁产生的原因 3 如何解决死锁问题 3 1 改变环路等待条件 3 2 破坏请求并持有条件 1 什么是死锁 死锁 是指两个或两个以上的进程在执行过程中 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 若无外力作
  • 【微信小程序】定时器超时处理设置方法【setInterval()和setTimeout()】

    2020年2月13日 0次阅读 共550个字 0条评论 0人点赞 QueenDekimZ Set Timeout Solution setTimeout和setInterval 函数都属于定时任务 一 settimeout延迟一段时间执行函
  • css中float用法

    float浮动 指将指定元素悬浮于所在整体之上 即将垂直排列的元素转换为水平同行显示 平时写出的HTML是具有先后顺序的 对于这个顺序我们称之为标准流 而浮动则是脱离标准流的另一个独立标准 下面给出float定义 float left 左浮
  • 阿里云大佬告诉你为什么学不会设计模式,归根到底还是方法不对

    最近总有读者在后台跟我说 工作几年 自己的代码质量似乎没有什么提升 我觉得他的情况非常典型 很多人应该或多或少都有过类似的经历 毕业几年 几乎一直在做复制黏贴的工作 偶尔会遇到原有业务扩展的需求 想简单应付一下完事的话 也不难 无非就是多加
  • 查询水果价格 (15分)

    给定四种水果 分别是苹果 apple 梨 pear 桔子 orange 葡萄 grape 单价分别对应为3 00元 公斤 2 50元 公斤 4 10元 公斤 10 20元 公斤 首先在屏幕上显示以下菜单 1 apple 2 pear 3 o
  • Hadoop学习——MapReduce的简单介绍及执行步骤

    MapReduce概述 MapReduce是一个分布式的计算框架 编程模型 最初由由谷歌的工程师开发 基于GFS的分布式计算框架 后来Cutting根据 Google Mapreduce 设计了基于HDFS的Mapreduce分布式计算框架
  • IDEA修改内存未生效原因和解决

    修改IDEA安装目录下的idea64 exe vmoptions server Xms1024m Xmx2048m XX ReservedCodeCacheSize 2048m 发现IDEA的内存修改并未生效 右下角显示依然是974M 原因
  • windows下进程间通信的(13种方法)

    Windows进程间的通信 迎风的祺 博客园 windows下进程间通信的 13种方法 phymat nico的专栏 CSDN博客 windows进程间通信
  • eclipse报错 parameterized types are only available if source level is 1.5 or greater

    preface 好久没有更新 blog 了 最近在 写新的项目 今天在用eclipse 出现了之前遇到的问题 这里记录下 问题 eclipse 控制台 报错 parameterized types are only available if
  • CUDA+OPENCV+PYTHON tensorflow 源码环境搭建

    CUDA OPENCV PYTHON tensorflow 源码环境搭建 接上文caffe环境安装 https blog csdn net u012350025 article details 104589982 主机环境ubuntu18
  • 基于C++的带权无向图的实现 (五)- 连通图和连通分量

    该系列文章是本人整理的有关带权无向图的数据结构和算法的分析与实现 若要查看源码可以访问我的github仓库 如有问题或者建议欢迎各位指出 目录 基于C 的带权无向图的实现 一 数据结构 基于C 的带权无向图的实现 二 遍历算法 基于C 的带
  • 台式计算机怎么看有没有开独显,台式机独立显卡怎么样打开

    给台式机插入了独立显卡 但不会打开怎么办呢 下面由学习啦小编给你做出详细的台式机独立显卡打开方法介绍 希望对你有帮助 台式机独立显卡打开方法一 把显示器的数据连接线接到独立显卡上 用的就是独立显卡 把显示器的数据线连接在主板的显示输出口上
  • MyEclipse8.5的安装过程

    1 双击进行安装 点Next接受 选择好路径后 等待安装完毕 2 选择路径 3 进入工作台如下图 4 配置Tomcat 工具栏 Window Preferences 5 Myeclipse Servers Tomcat 选择版本 勾选Ena
  • 2029:【例4.15】水仙花数

    2029 例4 15 水仙花数 时间限制 1000 ms 内存限制 65536 KB 提交数 1247 通过数 720 题目描述 求100 999中的水仙花数 若三位数ABC ABC A3 B3 C3 则称ABC为水仙花数 例如153 13
  • springboot2.x默认采用cglib代理,以及配置jdk动态代理的方法

    众所周知 springboot开启AOP需要在启动类加上注解 EnableAspectJAutoProxy 但开发过程中发现即使不加 EnableAspectJAutoProxy 注解 bean还是被代理过 而且是Cglib代理对象 此时在
  • win32下Qt5BLE蓝牙开发笔记

    BLE简介 BLE蓝牙是蓝牙2 0以上的蓝牙模块 经典蓝牙是蓝牙2 0以下的蓝牙 蓝牙分为客户端和服务器两端 经典蓝牙可以通过socket编程进行客户端与服务器之间的通信 与网络socket相似 BLE蓝牙则无法使用这种方式进行通信 BLE
  • ICASSP 2023说话人识别方向论文合集

    今年入选 ICASSP 2023 的论文中 说话人识别 声纹识别 方向约有64篇 初步划分为Speaker Verification 31篇 Speaker Recognition 9篇 Speaker Diarization 17篇 An
  • 算法竞赛当中的思考方法——方法论篇。

    方法论 万物皆朴素的第一性原理 几乎任何领域的任何问题的解决方案 都可以看作是 某个结构上的朴素方法的优化 计算机只能处理规模有限的问题 在给定规模且不考虑效率的情况下 问题一定存在朴素解法 具体手段有直接模拟 利用bit枚举 各种搜索算法