LeeBlog

导航

HDU 2047 阿牛的EOF牛肉串

#include <stdio.h>
void chart ( long long ch[] )
{
     long long  a = 3;//字母总数 
     long long  b = 2;//记住o外的其他字母  
     long long  c = 1;//o的个数 
     long long  b1;//   记录上一次其他字母的个数 
     ch[ 1 ] = a;
     for ( int i = 2; i < 45; ++i )
     {
         b1 = b;
         a = b * 3 + c * 2;
         b = b * 2 + c * 2;
         c = b1;
         ch[ i ] = a;
     }
 }
int main ( )
{
    long long ch[45];
    int n;
    chart ( ch );
    while ( scanf ( "%d" , &n ) == 1 )
          printf ( "%I64d\n" , ch[n] );
    return 0;
} 

 此题最重要的是要找规律,有两种方法来找出其规律,一种是唐聪的( 速度快)

  f ( n )  = [  f ( n - 1 ) + f ( n - 2 )];

  另一种是曹钦大侠的( 普遍性较强 )

  下面是曹钦大侠的思路解析:

      0        1      2      3      n

              E  ->  E  ->  E      ………………

                       ->  O

                       ->  F

                  ->   O  ->  E

                       ->  F

                 ->  F  ->  E

                       ->  O

                       ->  F

              O  ->   E  ->  E

                       ->  O

                       ->  F

                 ->  F  ->  E

                       ->  O

                       ->  F

              F  ->  E  ->  E

                       ->  O

                       ->  F

                 ->  O  ->  E

                       ->  F

                 ->  F  ->  E

                       ->  O

                       ->  F

    仔细观察上表可以看出随着n的增加O字母和非O字母有一定的关系;

    设有n节牛肉时总字母的可能种类为n,非o字母的可能总数为b,o的字母的可能种类为c,

    n = 1 时 , a1 = 3 ,  b1 = 2 ,  c1 = 1 ;

    n = 2 时,    a2 = b1 * 3 + c1 * 2 ,b2 = b1 * 3 - b1 + c1 * 2; c2 = b1;

    n = 3 时,  a3 = b2 * 3 + c2 *2 ,b3  = b2 * 3 - b2 + c2 * 2; c3 = b2;

    可以得到普遍规律  a( n ) = 3 * b ( n-1 ) + 2 *c ( n - 1 ), b( n ) = 2 * b( n - 1 ) + 2 * c ( n - 1 ), c ( n ) = c ( n - 1 );( 杭电2536 可用类似思路做 )

posted on 2011-01-29 15:31  LeeBlog  阅读(626)  评论(0编辑  收藏  举报