递推,求至少连续放置三个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) << "\n"
38 #define endl "\n"
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\n",(1ll<<n)-ans);
64     }
65     return 0;
66 }

原文地址:https://www.cnblogs.com/klaycf/p/9688355.html

时间: 2024-10-11 01:09:53

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

NYOJ-301递推求值

递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000)随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值.其中0<=f(1),f(2)<100,-100<=

递推求值【快速幂矩阵】

递推求值 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2   输入 第一行是一个整数T,表示测试数据的组数(T<=10000)随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值.其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=10000000

NYOJ——301递推求值(矩阵快速幂)

递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000) 随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值. 其中0<=f(1),f(2)<100,-100<=

递推求欧拉函数的最简单的详解

有以下的两条性质: if(gcd(i, prime[j]) == 1) phi[i * prime[j]] = phi[i] * phi[prime[j]]; //因为是积性函数.phi[prime[j]]其实就是prime[j]-1. else phi[i * prime[j]] = phi[i] * prime[j];  所以,可以模仿埃氏筛的方法,来进行递推,顺便同时求出素数表. F(i, 1, n) phi[i] = i; //相当于not_prime[]的作用 F(i, 1, n) {

LeetCode--SQL 查询:查找所有至少连续出现三次的数字。

编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+| Id | Num |+----+-----+| 1 | 1 || 2 | 1 || 3 | 1 || 4 | 2 || 5 | 1 || 6 | 2 || 7 | 2 |+----+-----+例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字. +-----------------+| ConsecutiveNums |+-----------------+| 1 |+------------

poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】

Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3523   Accepted: 1740 Case Time Limit: 2000MS   Special Judge Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material s

【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论

http://poj.org/problem?id=2478 题意:给定一个数x,求<=x的数的欧拉函数值的和.(x<=10^6) 题解:数据范围比较大,像poj1248一样的做法是不可行的了. 首先我们要了解欧拉函数的几个性质和推论:(今天跟好基友Konjak魔芋讨论了好久..) 推论(一): phi(p^k)=(p-1)*p^(k-1) 证明: 令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^k /p = p^(k-1)个. 1~n出去p的倍数,所以phi(n)= n -  p^

蓝桥杯 算法提高 递推求值

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const int mod = 99999999; 11 12 mat mul(m

UVa 10561 (SG函数 递推) Treblecross

如果已经有三个相邻的X,则先手已经输了. 如果有两个相邻的X或者两个X相隔一个.,那么先手一定胜. 除去上面两种情况,每个X周围两个格子不能再放X了,因为放完之后,队手下一轮再放一个就输了. 最后当“禁区”布满整行,不能再放X了,那个人就输了. 每放一个X,禁区会把它所在的线段“分割”开来,这若干个片段就可以看做若干个游戏的和. 设g(x)表示x个连续格子对应的SG函数值,递推来求g(x): g(x) = mex{ g(x-3), g(x-4), g(x-5), g(x-6) xor g(1),