LevOJ P1685飞跃悬崖(着色问题)

前言:

这道题吧,没有思路的时候想法可以非常多样,但解法异常简单,老规矩不想看直接翻最后抄代码

上题目:

思路:

一)我看到这道题第一个思路是分类解决:

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
123
123123123
123121312123231323123

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]);
    }
}

后记:

一开始只是找数字的规律写出来的,后面正经的去想为什么还是非常耗时的····太菜,还得练!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值