Codevs_P2825 危险的组合(DP)

时间限制: 1 s
空间限制: 64000 KB
题目等级 : 钻石 Diamond
题目描述 Description
有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够多。要求把N个盒子放成一行,但至少有3个U放在一起,有多少种方法?

输入描述 Input Description
包含一个整数N

输出描述 Output Description
输出一个整数表示方法数。

样例输入 Sample Input
样例1:4
样例2:5

样例输出 Sample Output
样例1:3
样例2:8

数据范围及提示 Data Size & Hint
对于100%的数据(3<=N<=30)

样例1解释:
UUUL、LUUU、UUUU

样例2解释:
UUUUL、UUUUU、UUULU、UUULL、LUUUU、LUUUL、ULUUU、LLUUU

简单DP,取决于前一个的末尾U的个数

#include
#include
using namespace std;
#define N 35
int n;long long no[N][3],ye[N];
int main(){
    scanf("%d",&n);
    if(n<3) {printf("0");return 0;}
    no[1][0]=no[1][1]=1;
    for(int i=2;i<=n;i++){
        no[i][0]=no[i-1][0]+no[i-1][1]+no[i-1][2];
        no[i][1]=no[i-1][0];
        no[i][2]=no[i-1][1];
        if(i>2) ye[i]=ye[i-1]*2+no[i-1][2];
    }
    printf("%lld",ye[n]);
    return 0;
}

你可能感兴趣的:(Codevs,数论,动态规划)