题解 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;
}

浙公网安备 33010602011771号