HDU2064&&HDU2077

HDU2064:
假设 f[ n ]是n块圆盘移动的次数。移动的时候有以下四个步骤:

  1. 第n块以上的 n-1块圆盘从 A柱 借助 B柱 移动到 C柱 ,移动的次数为f[ n -1 ]次。
  2. 第n块圆盘从 A柱 移动到 B柱 ,移动次数为 1。
  3. n-1块圆盘借助 B柱 (虽然第n块圆盘在B柱上,但他是最大的圆盘,n-1块中的所有圆盘都可放在他的上面,因此B柱也能看成空柱) 移动到 A柱,此时移动的次数和第一次一样,也是 f[ n - 1 ]次(因为两次都是移动n-1块圆盘,而且都是从一个柱借助一个柱移动到另一个柱上,而且是从最左(右)边的柱移动到最右(左)边的柱)。
  4. 第n块从 B柱 移动到 C柱。
  5. n-1块圆盘借助 B柱 移动到 C柱上,与第1,3次同理,也是移动了f[ n - 1 ]次。

所以得出结论:f[ n ] = 3 * f[ n - 1 ] + 2

附上AC代码:

#include<stdio.h>
int main( void )
{
    int i , n ;
    __int64 f [ 36 ] ;
    f [ 1 ] = 2 ;
    for( i = 2 ; i < 36 ; i++ )
        f [ i ] = 3 * f [ i - 1 ] + 2 ;
    while( scanf( "%d" , &n ) != EOF  )
        printf( "%I64d\n" , f [ n ] ) ;
    return 0 ;
}

移动次数到后面会大的离谱,记得要用long long类型

=====================================================================================================

HDU2077:
有了HDU2064的基础后,再理解这题就会比较轻松。
设g[ n ]为n块圆盘移动的次数,移动的时候有以下步骤:

  1. 第n块以上的n-1块圆盘借助 C柱 移动到 B柱,移动g[ n - 1 ]次
  2. 第n块直接从 A柱 移动到 C柱,移动两次
  3. n-1块再从 B柱 借助 C柱 移动到 A柱,移动g[ n - 1 ]次
    得出结论:g[ n ] = f[ n - 1 ] + 2 (因为第1,3步合起来就可看成把前n-1块圆盘移到了 C柱。

AC代码:

#include<stdio.h>

int main( void )
{
    int T , i , n ;
    __int64 f [ 21 ] ;

    f [ 0 ] = 0 ;
    f [ 1 ] = 2 ;
    for ( i = 2 ; i < 21 ; i++ )
        f [ i ] = 3 * f [ i - 1 ] + 2 ;

    scanf( "%d" , &T ) ;
    while( T-- )
    {
        scanf( "%d" , &n ) ;
        printf( "%I64d\n" , f [ n - 1 ]  + 2 ) ;
    }
    return 0 ;
}

总结:凡是题目要求我们求非常大的,多组的数,那么正确其中一定会有有规律可循(这也应该是以后一时间所要反应到的),不可能用暴力枚举。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值