题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064
题目描述:
思路:
最开始的我但看这个输入输出结果,然后发现,这不就是i^3-1嘛!简单!然后就错了wa的一下就哭了。好啦,真正是需要用到递归来解决的。
正确思路:
//设n个盒子从a到c柱移动需要f(n)步,那么
//n-1个先a->c需要,f(n-1)步;
//然后第n个从a->b,1步;
//再是n-1个从c->a,f(n-1)步;
//然后是第n个从b->c,1步;
//最后就是将n-1个从a-c,f(n-1)步;
//将上述加起来得递归公式: f(n) = 3*f(n-1)+2
然后直接上ac代码!
#include<stdio.h>
#include<math.h>
typedef long long int ll;
int main(){
ll value[40];
int n;
//设n个盒子从a到c柱移动需要f(n)步,那么
//n-1个先a->c需要,f(n-1)步;
//然后第n个从a->b,1步;
//再是n-1个从c->a,f(n-1)步;
//然后是第n个从b->c,1步;
//最后就是将n-1个从a-c,f(n-1)步;
//将上述加起来得递归公式: f(n) = 3*f(n-1)+2
value[1] = 2;
for(int i = 2;i <=35;i++){
value[i] = 3*value[i-1] + 2;
}
while(scanf("%d",&n)!=EOF){
printf("%lld\n",value[n]);
}
return 0;
}
然后最后ac过后呢,自己还是不死心想找出到底这个递归的和i^3-1算出来的结果有什么不同。
最后发现如下图所示的情况:
于是我就凑特殊值,34,35的下标的另外处理输出,然后也过了。这个代码发出来大家就乐呵乐呵就行,正确思路个人认为还是递归。
#include<stdio.h>
#include<math.h>
typedef long long int ll;
int main(){
ll value[35];
int t = 0;
int n = 0;
for(int i = 0;i <= 35;i++){
value[i] = pow(3,i);
}
while(scanf("%d",&n)!=EOF){
if(n==34) printf("%lld\n",value[n]);
else if(n == 35) printf("%lld\n",value[n]+2);
else{
printf("%lld\n",value[n]-1);
}
}
return 0;
}