题解 UVA580 【危险的组合】

一.题意

有一些装有铀(用 $\mathrm{U}$  表示)和铅(用 $\mathrm{L}$ 表示)的盒子,数量均足够多。要求把 $\mathrm{N}$ 个盒子放成一行,但至少有 $3$ 个 $\mathrm{U}$ 放在一起,有多少种方法?

二.解法

一种常见套路:方案数=总方案数-不合法方案数。

总方案数简单:$2^n$(铀和铅两种元素组合)。

不合法方案数:$dp_i$ 表示第 $i$ 个位置以 $\mathrm{L}$ 结尾的总数。

组成$dp_i$的集合有:$dp_{i-1},dp_{i-2},dp_{i-3}$(因为结尾是$\mathrm{L}$ , 距离又不会超过 $3$ ,因此肯定不满足至少有 $3$ 个 $\mathrm{U}$ 放在一起)。

所以递推式子是:
$$dp_i=dp_{i-1}+dp_{i-2}+dp_{i-3}$$

三.代码:

 

#include<bits/stdc++.h>
using namespace std;
int n,f[100];
int main(){
    int ans=1;
    f[1]=2;
    f[2]=4;
    f[3]=7;
    for(int i=4;i<=99;i++){
        f[i]=f[i-1]+f[i-2]+f[i-3];//递推式
    }
    while(cin>>n&&n){
        ans=1;
        for(int i=1;i<=n;i++){
            ans*=2;
        }
        cout<<ans-f[n]<<endl;
    }
    return 0;
}

  

posted @ 2022-03-03 06:32  21xf2257  阅读(170)  评论(1)    收藏  举报