递推,求至少连续放置三个U的危险组合

Posted klaycf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递推,求至少连续放置三个U的危险组合相关的知识,希望对你有一定的参考价值。

题意

有两种方块,L和U,有至少三个连续的U称为危险组合,问有多少个危险组合

solution:

至少这个概念比较难求 ,所以转化为(1ll<<n)-安全组合

dp[n][i]表示前n个数里以i个U结尾的个数

递推方程

dp[i][0]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2];
dp[i][1]=dp[i-1][0];
dp[i][2]=dp[i-1][1];

 

技术分享图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cmath>
 6 #include<queue>
 7 #include<cstring>
 8 #define mp make_pair
 9 #define pb push_back
10 #define first fi
11 #define second se
12 #define pw(x) (1ll << (x))
13 #define sz(x) ((int)(x).size())
14 #define all(x) (x).begin(),(x).end()
15 #define rep(i,l,r) for(int i=(l);i<(r);i++)
16 #define per(i,r,l) for(int i=(r);i>=(l);i--)
17 #define FOR(i,l,r) for(int i=(l);i<=(r);i++)
18 #define eps 1e-9
19 #define PIE acos(-1)
20 #define cl(a,b) memset(a,b,sizeof(a))
21 #define fastio ios::sync_with_stdio(false);cin.tie(0);
22 #define lson l , mid , ls
23 #define rson mid + 1 , r , rs
24 #define ls (rt<<1)
25 #define rs (ls|1)
26 #define INF 0x3f3f3f3f
27 #define LINF 0x3f3f3f3f3f3f3f3f
28 #define freopen freopen("in.txt","r",stdin);
29 #define cfin ifstream cin("in.txt");
30 #define lowbit(x) (x&(-x))
31 #define sqr(a) a*a
32 #define ll long long
33 #define ull unsigned long long
34 #define vi vector<int>
35 #define pii pair<int, int>
36 #define dd(x) cout << #x << " = " << (x) << ", "
37 #define de(x) cout << #x << " = " << (x) << "
"
38 #define endl "
"
39 using namespace std;
40 //**********************************
41 const int maxn=30;
42 int n;
43 ll dp[35][3];
44 //**********************************
45 void Init()
46 {
47     cl(dp,0);
48     dp[1][0]=dp[2][2]=dp[1][1]=dp[2][1]=1;dp[2][0]=2;
49     FOR(i,3,30){
50         dp[i][0]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2];
51         dp[i][1]=dp[i-1][0];
52         dp[i][2]=dp[i-1][1];
53 //        dd(i);dd(dp[i][0]);dd(dp[i][1]);de(dp[i][2]);
54     }
55 }
56 //**********************************
57 int main()
58 {
59     Init();
60     while(cin>>n,n){
61         ll ans=0;
62         ans=dp[n][0]+dp[n][1]+dp[n][2];
63         printf("%lld
",(1ll<<n)-ans);
64     }
65     return 0;
66 }
View Code

 

 



以上是关于递推,求至少连续放置三个U的危险组合的主要内容,如果未能解决你的问题,请参考以下文章

真的猛士,敢于开数学!!!!!

codevs5833 放置核弹

20180718

AcWing 885. 求组合数 I(递推式预处理)

#组合计数,容斥定理#U136346 数星星

危险的组合