这道题是一道用来练习递推的经典题目,但是在推出递推关系式,满心欢喜将代码提交后只通过了四组数据,i can’t believe that;马上溜去看题解,嗯,一个大牛说这是道水题(没毛病),用高精度提交就可以了。。。。
高精度???我就乖乖滚去百度了
题目如下
题目描述
给定AAA、BBB、CCC三根足够长的细柱,在AAA柱上放有2n2n2n个中间有孔的圆盘,共有nnn个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3n=3n=3的情形)。
现要将这些圆盘移到CCC柱上,在移动过程中可放在BBB柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)AAA、BBB、CCC三根细柱上的圆盘都要保持上小下大的顺序;
任务:设AnA_nAn为2n2n2n个圆盘完成上述任务所需的最少移动次数,对于输入的nnn,输出AnA_nAn。
输入输出格式
输入格式:
一个正整数nnn,表示在AAA柱上放有2n2n2n个圆盘。
输出格式:
一个正整数, 为完成上述任务所需的最少移动次数AnA_nAn。
输入输出样例
输入样例#1: 复制
【输入样例1】
1
【输入样例2】
2
输出样例#1: 复制
【输出样例1】
2
【输出样例2】
6
说明
【限制】
对于50%50%50%的数据,1≤n≤251 \le n \le 251≤n≤25
对于100%100%100%的数据,1≤n≤2001 \le n \le 2001≤n≤200
【提示】
设法建立AnA_nAn与An−1A_{n-1}An−1的递推关系式。
当塔有n种不同尺寸圆盘时,可以将移动过程分为三步;上边的n-1种圆盘移到B;这一步需要移动A(n-1)次,然后第二步将最大尺寸的圆盘移动到C,此步需要移动两次;最后一步将B的n-1种圆盘放到C,这一步需要移动的次数为A(n-1);三次移动共2A(n-1)+2次;即A(n)=2A(n-1)+2;
做到这儿此题算是解决了一半;
剩下的就是高精度算法了
将超过long long 范围的数字储存进数组里,通过模仿手算的方法对数组进行操作;
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int a[200];
int n;
memset(a,0,sizeof(a));//将数组全部归零,以便判断大数的最高位
cin>>n;
a[1]=2;
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
a[j]*=2;
}
for(int j=1;j<i;j++)
{
while(a[j]>=10)
{
a[j]-=10;
a[j+1]+=1;
}
}
a[1]+=2;
while(a[1]>=10)
{
a[1]-=10;
a[2]++;
}
}
int k=100;//判断大数的最高位
while(a[k]==0)
{
k--;
}
for(int i=k;i>0;i--)
cout<<a[i];
return 0;
}
这道题真的不错,学到了很多东西