hdu 2045(递推)

来源:互联网 发布:mysql监控sql语句 编辑:程序博客网 时间:2024/06/09 11:07

1个格子的时候   3种

2个格子的时候   6种

3个格子的时候   6种

4个格子的时候:

      分两种情况:

  1. 前3个格子符合所有规则,即间隔颜色不同,同时第1个和第3个颜色也不同。这时候第4个格子只有1种选择
  2. 前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个格子的情况

  1. 前n-1个格子符合所有规则,即间隔颜色不同,同时第1个和第n-1个颜色也不同。这时候第n个格子只有1种选择。前边n-1个格子有f(n-1)中涂法
  2. 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[n]<<endl;}return 0;}
像这种有条件限制的递推,一定有"符合规则"和"不符合规则"这两种情况讨论。。此外,还要注意问题之间不能够重叠了。比如f(n)能够包括的情况,就不需要f(n-1)了,除非有f(n)不能涵盖的情况。。

0 0
原创粉丝点击