[DP][高精][NOIP]Hanoi双塔问题

题目梗概

Hanoi塔问题的基础上,每种圆盘加了一个。实际内容并没有变化。

思考

首先来一波Hanoi问题的步数公式推导:

首先n个不同的圆盘。

只有把n-1个圆盘从a->b,最后把a上剩余的一个圆盘从a->c。

之后把b上的n-1个圆盘从b->c。

这里的两步:把n-1个圆盘从a->c,和n-1个圆盘从b->c.所需要的步骤数。实际上就是把n-1个圆盘从a移动到c的步骤数*2,因为是等价的。从a->b和从b->c移动的圆盘个数都是一样的,所以步数就是 (n-1)*2。

然后还要多一步就是把a上的一个圆盘放到c。

所以递推式是 $A_{n}=A_{n-1}\times 2+1$

这个递推式一般递推取模时使用,不过有个更加简便的公式。

$A_{n}=A_{n-1}\times 2+1$

$\mapsto A_{n} = A_{n-1}\times 2 + 1 + 1 - 1$

$\mapsto A_{n} = A_{n-1}\times 2 + 2 - 1$

$\mapsto A_{n} + 1 = (A_{n-1} + 1 )\times 2$

设$B_{n}=A_{n}+1$

则$B_{n}$为等比数列

所以$B_{n}=B_{1}\times 2^{n-1}$ 即 $B_{n}=2 \times 2^{n-1}$ ->  $B_{n}=2^{n}$

所以$A_{n}=2^{n}-1$

推导完毕

这道题目不过是两个相同的圆盘,所以只是步数*2的问题。只不过这道题目需要高精

代码实现:

#include <cstdio>
#include <iostream>
#include <algorithm>
int Pos,a[1002],n,len=1;

void Run(int n){
    a[1]=1;
    while(n--){
        for(int i=1;i<=len;i++){
            a[i]*=2;
        }
        for(int i=1;i<=len;i++){
            if(a[i]>9) {
            a[i+1]+=a[i]/10;
            a[i]%=10;
            }
        }
        if(a[len]) len++;
    }
    a[1]-=2;
    while(a[len]==0){
        len--;
    }
    for(int i=len;i>=1;i--){
        printf("%d",a[i]);
    }
    return ;
}

int main(){
    scanf("%d",&n);
    Run(n+1);
    return 0;
}
时间: 2024-10-15 12:17:19

[DP][高精][NOIP]Hanoi双塔问题的相关文章

【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. 每次取走的各个元素只能是该元素所在行的行首或行尾: 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素

BZOJ5300 [Cqoi2018]九连环 【dp + 高精】

题目链接 BZOJ5300 题解 这题真的是很丧病,,卡高精卡到哭 我们设\(f[i]\)表示卸掉前\(i\)个环需要的步数 那么 \[f[i] = 2*f[i - 2] + f[i - 1] + 1\] 直接高精递推不仅\(MLE\)而且\(TLE\) 然后就要用到数学求通项公式,或者打表找规律 \[f[n] = \lfloor \frac{2^(n + 1)}{3} \rfloor\] 高精乘低精就可以过了 #include<algorithm> #include<iostream&

【POJ】3378 Crazy Thairs(树状数组+dp+高精)

题目 传送门:QWQ 分析 题意:给个数列,求有多少五元上升组 考虑简化一下问题:如果题目求二元上升组怎么做. 仿照一下逆序对,用树状数组维护一下就ok了. 三元怎么做呢? 把二元的拓展一位就可以了,即把第三个也扔进树状数组 所以这题就渐渐明朗了: 用$ dp[i][x] $表示以$ A[x] $结尾的$ x $元上升组有多少个 那么: $ dp[i][x]=\sum_{j=1}^{i-1} dp[j][x-1] (A[j]<A[i]) $ 其中 $ dp[i][1]=1 $ 因为多了一位大的就

SCUT - 299 - Kaildls的数组划分 - dp - 高精

https://scut.online/p/299 \(dp[i][k]\) 为前 \(i\) 个数分 \(k\) 组的最大值,那么 $dp[i][k]=max_{p=1}^{i-1}{dp[p][k-1]*sum(p+1,i)} $ #include<bits/stdc++.h> using namespace std; typedef long long ll; struct BigInt { const static int mod = 10000; const static int D

POJ 1202 Family 概率,DP,高精 难度:2

http://poj.org/problem?id=1202 难度集中在输出格式上,因为输出格式所以是高精度 递推式: 血缘肯定只有从双亲传到儿子的,所以,设f,m为双亲,son为儿子,p[i][j]为i和j之间的血缘关系,p[j][i]=p[i][j] 则: p[son][f]=p[son][m]=0.5+0.5*p[f][m] 对于兄弟和其他不是双亲的节点j,则有 p[son][j]=0.5*(p[f][j]+p[m][j]) 另外:http://swerc.up.pt/2002/Data/

noip推荐系列:遥控车[字符串+高精+二分答案]

[问题描述] 平平带着韵韵来到了游乐园,看到了n辆漂亮的遥控车,每辆车上都有一个唯一的名字name[i].韵韵早就迫不及待地想玩名字是s的遥控车.可是韵韵毕竟还小,她想象的名字可能是一辆车名字的前缀(也就是说能确定一个i,使s是name[i]的前缀),这时她就能玩第i辆车:或者是一个无中生有的名字,即s不是任何一辆车名字的前缀,这时候她什么也不能玩.你需要完成下面的任务: 1.韵韵想了m个她想要的名字,请告诉她能玩多少次. 2.由于管理员粗心的操作,导致每辆车的摆放位置都可能出现微小的差错,原来

bzoj 3287: Mato的刷屏计划 高精水题 &amp;&amp; bzoj AC150

3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Description Mato同学喜欢上QQ,但是有少数傻逼总是问他一些弱智问题.Mato感到很反感,想要鄙视一下他们.他决定在QQ上刷屏,也就是发出一大堆字符.Mato的键盘上有4个键:A.B.C.D.按A就会输入一个字符,按B会把所有字符选中,按C会把选中的字符放入剪贴板,按D会插入剪贴板的内容.他的

[贪心][高精]P1080 国王游戏(整合)

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国

【日常学习】【floyd传递闭包+高精】codevs1009 产生数题解

题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规则(k=2): 2-> 5 3-> 6 上面的整数 234 经过变换后可能产生出的整数为(包括原数): 234 534 264 564 共 4 种不同的产生数 问题: 给出一个整数 n 和 k 个规则. 求出: 经过任意次的变换(0次或多次),能产生出多少个不同整数. 仅要求输出个数. 输入描述