HDU 2047 阿牛的EOF牛肉串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#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 可用类似思路做 )
正着想比较复杂,倒着想感觉还可以;
思考最后一个字符只可能有三种情况:E,F,O;
最后总的涂法为F(n);
当是E的时候倒数第二个字符可以随便涂,因而为此涂法数为:F(n-1);
当是F的时候倒数第二个字符也可以随便涂,因而为此涂法数也为:F(n-1);
当是O的时候
倒数第二个字符不能随便了,因为连续的2个O是不符合要求的,因此O的时候又被分为二种情况为E或F。
在最后2个字符为EO的情况下,倒数第三个字符可以随便,因此此涂法为F(n-2);
在最后2个字符为FO的情况下,倒数第三个字符也可以随便,因此此涂法也为F(n-2);
此时已经讲所有的情况考虑完毕,F(n)=2*F(n-1)+2*F(n-2);