以下文字资料是由(历史新知网)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
F(n,m)
表示最后剩下那个人的索引号
如何才能将N = 7 的排列变回到N = 8 呢?
我们先把被杀掉的C补充回来,然后右移m个人,发现溢出了,再把溢出的补充在最前面
神奇了 经过这个操作就恢复了N = 8 的排列了!
因为N=8时D前面有3个数,7变成8时要补回这3个数,采用的方法是右移3位然后求余
回溯法,用一个数组判断当前字符是否被访问过
保证在填每一个空位的时候重复字符只会被填入一次,在递归函数中,我们限制每次填入的字符一定是这个字符所在重复字符集合中「从左往右第一个未被填入的字符」
!used[i-1]的作用是前一个树层访问完了,前一个树层访问完了会撤销选择把visited【i-1】标为false
树枝是一个节点,树层是几个节点,used[i - 1] == false说明前一个树层递归完了撤销选择把used[i - 1] 恢复为false,所以 used[i - 1] == false代表前一个树层访问过了和当前树层是重复的然后就剪枝,剪树层剪了几个节点,剪树枝只是剪了一个节点
用两个队列,一个普通队列,一个单调队列,单调队列的对头是队列的最大值,如果普通队列的对头刚好是队列的最大值,出队时单调队列的对头元素也要出队
dp[b]*3是最小的
所以第三个丑数是dp【b】*3即3,dp[b]*3用完了,即比较完了后面再无需比较,然后b指针右移一位
以此类推算到第n个丑数
使用当前丑数是否等于前一个丑数*2或3或5来判断哪个指针右移,例如第二个丑数等于第一个丑数乘2,a指针右移,第三个丑数等于第二个丑数乘3,b指针右移
设定四个边界,上下左右
依次打印:左到右,上到下,右到左,下到上
左边界小于右边界和上边界小于下边界时可以打印右到左和上到下
打印完一层向内层收缩,上边界和左边界加1,下边界和右边界减1,直到收缩到最后一层,最后一层打印完是左边界大于右边界,上边界大于下边界
n个骰子,一共有6**n种情况
dp[2][2]表示2个骰子点数的和为2出现了多少次
dp[1][1]+骰子点数为1就等于dp[2][2],因为1个骰子点数的和为1出现的次数再加上一个骰子点数为1刚好就凑成了2个骰子点数的和为2出现的次数
无论这些数字怎么取排列,形成的数字的位数是不变的
那么就是高位的数字肯定是越小越好。
我们先考虑一下怎么排列两个数字,比如 1 和 20,高位越小越好,放 1,组合成 120
把数字转换成字符串再从左往右比较每一个数字
36、38 和 5,首先肯定先放 36,剩下 38 和 5,然后对这两个数进行排列 385,所以最后的结果为 36385
先把数组分隔成子数组,统计出子数组内的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目,统计完子数组内的逆序对的数目后要对子数组排序,排序完之后再统计出两个相邻子数组之间的逆序对的数目
这两个子数组有两个逆序对
统计完这两个子数组后对这两个子数组进行排序,然后统计出两个相邻子数组之间的逆序对的数目,只能是第一个数组和第二数组比,因为是逆序对只能是前面和后面的比
7比6大,子数组大小为2,6是最大的,所以7增加两个逆序对
5比4大,5增加一个逆序对
第二张图为每轮递归时l和r的值,类似于二叉树的后序遍历,l等于r时数组只剩一个元素,相当于叶子节点
第三张图为后序遍历完返回 l和r的值,合并排序之前的数组和合并排序之后的数组,排序完之后l和r之间的数组都是有序的
0
发生相等情况时,都默认移动左边的
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。