算法练习(2)——约瑟夫环和坐标公式的推导

看一下上面的牛客题。题目的意思是n个小朋友围成一个圆环,编号从0开始,数m个数时,让小朋友出列,然后出列小朋友的下一个位置为0,继续数m个数,然后小朋友出来,直到最后一个小朋友,然后返回下标。

这个题目就是约瑟夫环问题,我们解决这个问题有很多种方法,比如 数组,链表模拟过程来写。我们今天用动态规划来写这个题目,并且推到一下这个题目的一个坐标公式。

公式推导

我们先表示一下我们要求的问题:

接着就是列写转移方程:

我们就是要求 dpn 与 dpn-1 的关系。

我们表示一下紫色和绿色,

因为紫色减去 m-1 位置,得到了绿色,所以 dpn 为紫色,dpn-1 为绿色。

因为dpn表示n个孩子围成一圈时,最后一个孩子的坐标。又因为 紫色和绿色的m相同,所以,紫色和绿色的结果最后是一样的,即 dpn 和dpn-1 的值是一样的。

我们接下来找 紫色和绿色的关系,从上图可以看到,绿色的下标+m就是紫色的下标(紫色0位置看的清楚)。所以,我们得到下面的式子:

我们最后考虑一下极端情况,如果绿色的值+m后的值大于n的话,我们就要把这个值给矫正,怎么矫正呢?就是%n。

所以,我们就得到了最后的式子:

于是,我们把 f(n,m)=(f(n-1,m)+m)%n叫做坐标公式,其中 f(n,m)表示n个数据,把第m个数据清除,留下最后一个数据的编号。

代码

复制代码
int LastRemaining_Solution(int n, int m) {
        int ans=0;//ans表示dp[1]
        for(size_t i=2;i<=n;++i)
        {
            ans=(ans+m)%i;
        }
        return ans;
    }

今天就是这样了,我还得继续加油!!!

相关推荐
依然鸣3 分钟前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
恣逍信点1 小时前
《凌微经》价值论:变化即本体,价值即涌现
人工智能·科技·程序人生·蓝桥杯·业界资讯·交友·哲学
qeen873 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI3 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机4 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
Nil2085 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
-dzk-5 小时前
【动态规划】LC 118.杨辉三角
算法·动态规划
恣逍信点5 小时前
《凌微经》静态自悖——变化之自因
人工智能·科技·算法·机器学习·业界资讯·拓扑学·哲学
吃着火锅x唱着歌5 小时前
LeetCode 3885.设计事件管理器
算法·leetcode·职场和发展