您的位置:首页 > 其它

hdu 2045(递推)

2016-01-30 09:16 441 查看
1个格子的时候   3种

2个格子的时候   6种

3个格子的时候   6种

4个格子的时候:

      分两种情况:
前3个格子符合所有规则,即间隔颜色不同,同时第1个和第3个颜色也不同。这时候第4个格子只有1种选择
前3个格子不符合所有规则,即间隔颜色不同,但是第1个和第3个颜色相同。这时候,第4个格子有2种选择

那么怎么计算有4个格子的情况呢?

设函数f(n), f(1) = 3; f(2) = 6; f(3) = 6;

f(4) = f(3) + 2*f(2)=18;

当有n个格子,也分为两种情况,我们只需要考虑最后2个格子的情况
前n-1个格子符合所有规则,即间隔颜色不同,同时第1个和第n-1个颜色也不同。这时候第n个格子只有1种选择。前边n-1个格子有f(n-1)中涂法
前n-1个格子不符合所有规则,即间隔颜色不同,但是第1个和第n-1个颜色相同。这时候,第n个格子有2种选择。那么前n-2个格子有f(n-2)种可能,这种情况下有2*f(n-2)种涂法

从而有递推公式:f(n) =
f(n-1) + 2*f(n-2)

AC:

#include<iostream>
#include<cstdio>
using namespace std;

__int64 f[55];
int main()
{
f[1] = 3,f[2] = 6,f[3] = 6;
for(int i = 4; i <= 50; i++)
f[i] = f[i-1] + 2*f[i-2];
int n;
while(cin>>n)
{
cout<<f
<<endl;
}
return 0;
}像这种有条件限制的递推,一定有"符合规则"和"不符合规则"这两种情况讨论。。此外,还要注意问题之间不能够重叠了。比如f(n)能够包括的情况,就不需要f(n-1)了,除非有f(n)不能涵盖的情况。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递推