递推

落花浮王杯 提交于 2019-12-03 10:10:06

 

 

HDU 2045

•题意

  有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green) 三色涂每个格子;

  每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色;

  求全部的满足要求的涂法;

•题解(递推)

  定义 $f[i]$ 表示 $i$ 个格子的总方案数;

  假设 $f[1],f[2],\cdots ,f[i-1]$ 已经求出,如何求出 $f[i]$ 呢?

  考虑到这一点 $i$ 与 $i-1$ 不同色,同时 $i$ 与 $1$ 也不同色;

  $i$ 个格子的总方案数是不是可以分为以下两种:

  ① 第 $i-1$ 个格子与第 $1$ 个格子不同色

  ② 第 $i-1$ 个格子与第 $1$ 个格子同色

  对于情况①,已知 $f[i-1]$ 求解的是 $i-1$ 与 $1$ 不同色的总方案数,所以,情况①的答案为 $f[i-1]$;

  对于情况②,因为第 $i-1$ 个格子与第 $1$ 个格子同色,且第 $i-1$ 个格子与第 $i-2$ 个格子不同色;

  也就是说,求解第 $i-1$ 个格子与第 $1$ 个格子同色的总方案数可以转化为求解第 $i-2$ 个格子与第 $1$ 个格子不同色的总方案数;

  易得 $f[i-2]$ 就是解,又因为第 $i-1$ 个格子与第 $1$ 个格子同色,所以,第 $i$ 个格子有两种选择;

  所以情况②的总方案数为 $2\times f[i-2]$;

  所以,$f[i]=f[i-1]+2\times f[i-2]$;

•Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int N=60;
 5 
 6 int n;
 7 ll f[N];
 8 
 9 int main()
10 {
11     f[1]=3;
12     f[2]=f[3]=6;
13     for(int i=4;i < N;++i)
14         f[i]=f[i-1]+2*f[i-2];
15 
16     while(~scanf("%d",&n))
17         printf("%lld\n",f[n]);
18 }
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!