前言:
这道题吧,没有思路的时候想法可以非常多样,但解法异常简单,老规矩不想看直接翻最后抄代码
上题目:
思路:
一)我看到这道题第一个思路是分类解决:
1.一种颜色,显然有3种可能
2.两种颜色,显然全部可以,是一个排列组合问题
3.到三种颜色就开始复杂了,是一个填色问题
到这边思维卡壳了,于是换一种想法:递推
二)每个球能取得颜色数和前面两个相关,所以我们需要考虑n-2 n-1 n 三个球
初始化数组
long long a[50];
为了阅读方便我们使用从1开始的下标开始初始化
a[1] = 3; //同上,路径长度为1,三种上色方法
a[2] = 9; //路径长度为2,有单色3种 + 双色6种(有顺序的A32);
考虑
1)n-2和 n-1颜色一样,此时 a[n-2] = a[n-1] ,第 n 个珠子有 3 * a[n-2]
2)n-2和 n-1颜色不同时不太好理解,我是画图看出来的,如下图,有点抽象,类似一个三叉树,自己画画图就能懂了
我这图以0为root节点
0 | |||||||||||||||||||||||||||||||
1 | 2 | 3 | |||||||||||||||||||||||||||||
1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 | |||||||||||||||||||||||
1 | 2 | 3 | 1 | 2 | 1 | 3 | 1 | 2 | 1 | 2 | 3 | 2 | 3 | 1 | 3 | 2 | 3 | 1 | 2 | 3 |
a[n]行包括a[n-1] 和 a[n-2] 颜色相同与不同的情况(比如图中第四行共有三组带123的组,这三组分别是从第三行第二行相同的元素衍生出来的(比如第四行的第一个123就是由第二行和第三行的1衍生出来的))
因此n-2和 n-1颜色不同时,第n个位置应该用总的减去上一种的再乘二,为 2 * [ a[n-1] - a[n-2] ]
3)因此第n个位置递推公式 a[n] = 3 * a[n-2] + 2 * [a[n-1] - a[n-2]] = 2 * a[n-2] + a[n-1]
由此分析完了,代码非常简单,放下面了,也无需注释:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
long long a[50];
int main()
{
int n;
while (scanf("%d",&n) != EOF)
{
a[1] = 3;
a[2] = 9;
for (int i = 3; i <= n; i++)
a[i] = 2 * a[i - 1] + a[i - 2];
printf("%lld\n", a[n]);
}
}
后记:
一开始只是找数字的规律写出来的,后面正经的去想为什么还是非常耗时的····太菜,还得练!