递推,求至少连续放置三个U的危险组合
UVA580-Critical Mass
题意
有两种方块,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];
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#include<cstring>
#define mp make_pair
#define pb push_back
#define first fi
#define second se
#define pw(x) (1ll << (x))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define rep(i,l,r) for(int i=(l);i<(r);i++)
#define per(i,r,l) for(int i=(r);i>=(l);i--)
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define eps 1e-9
#define PIE acos(-1)
#define cl(a,b) memset(a,b,sizeof(a))
#define fastio ios::sync_with_stdio(false);cin.tie(0);
#define lson l , mid , ls
#define rson mid + 1 , r , rs
#define ls (rt<<1)
#define rs (ls|1)
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define freopen freopen("in.txt","r",stdin);
#define cfin ifstream cin("in.txt");
#define lowbit(x) (x&(-x))
#define sqr(a) a*a
#define ll long long
#define ull unsigned long long
#define vi vector<int>
#define pii pair<int, int>
#define dd(x) cout << #x << " = " << (x) << ", "
#define de(x) cout << #x << " = " << (x) << "\n"
#define endl "\n"
using namespace std;
//**********************************
const int maxn=;
int n;
ll dp[][];
//**********************************
void Init()
{
cl(dp,);
dp[][]=dp[][]=dp[][]=dp[][]=;dp[][]=;
FOR(i,,){
dp[i][]=dp[i-][]+dp[i-][]+dp[i-][];
dp[i][]=dp[i-][];
dp[i][]=dp[i-][];
// dd(i);dd(dp[i][0]);dd(dp[i][1]);de(dp[i][2]);
}
}
//**********************************
int main()
{
Init();
while(cin>>n,n){
ll ans=;
ans=dp[n][]+dp[n][]+dp[n][];
printf("%lld\n",(1ll<<n)-ans);
}
return ;
}
第二种实现方法
dp[i+j][1]+=dp[i][0];
dp[i+j][0]+=dp[i][1];
/*************************************************************************
> File Name: a.cpp
> Author: QWX
> Mail:
> Created Time: Sun 30 Sep 2018 04:01:42 AM PDT
************************************************************************/ //{{{ #include
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<complex>
#include<bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define first fi
#define second se
#define pw(x) (1ll << (x))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define rep(i,l,r) for(int i=(l);i<(r);i++)
#define per(i,r,l) for(int i=(r);i>=(l);i--)
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define eps 1e-9
#define PIE acos(-1)
#define cl(a,b) memset(a,b,sizeof(a))
#define fastio ios::sync_with_stdio(false);cin.tie(0);
#define lson l , mid , ls
#define rson mid + 1 , r , rs
#define ls (rt<<1)
#define rs (ls|1)
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define dd(x) cout << #x << " = " << (x) << ","
#define de(x) cout << #x << " = " << (x) << "\n"
#define endl "\n"
using namespace std;
//}}} ll dp[][];
int n; int main()
{
dp[][]=dp[][]=;
FOR(i,,){
FOR(j,,)dp[i+j][]+=dp[i][];
FOR(j,,)dp[i+j][]+=dp[i][];
}
while(cin>>n,n)cout<<(1ll<<n)-dp[n][]-dp[n][]<<endl;
return ;
}
类似题目
题意:
给你一个串的长度n,串由1,2组成,1连续不超过a个,2连续不超过b个,问有多少种这样的串,对1e9+7取模。
solution:
递推方程
往后补值:dp[i+j][1]+=dp[i][0];
dp[i+j][0]+=dp[i][1];
向前取值:dp[i][1]+=dp[j][0];
dp[i][0]+=dp[j][1];
/*************************************************************************
> File Name: j.cpp
> Author: QWX
> Mail:
> Created Time: Fri 05 Oct 2018 08:58:42 PM PDT
************************************************************************/ //{{{ #include
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<complex>
//#include<bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define first fi
#define second se
#define vi vector<int>
#define pii pair<int,int>
#define pw(x) (1ll << (x))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define rep(i,l,r) for(int i=(l);i<(r);i++)
#define per(i,r,l) for(int i=(r);i>=(l);i--)
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define eps 1e-9
#define PIE acos(-1)
#define cl(a,b) memset(a,b,sizeof(a))
#define fastio ios::sync_with_stdio(false);cin.tie(0);
#define lson l , mid , ls
#define rson mid + 1 , r , rs
#define ls (rt<<1)
#define rs (ls|1)
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define dd(x) cout << #x << " = " << (x) << ","
#define de(x) cout << #x << " = " << (x) << "\n"
#define endl "\n"
using namespace std;
//}}} int n;
const int maxn=5e5+;
int dp[maxn][];
const int mod=1e9+;
inline int add(int a,int b){a+=b;if(a>mod)a-=mod;return a;} int main()
{
int n,a,b;
cin>>n>>a>>b;
cl(dp,);
dp[][]=dp[][]=;
FOR(i,,n){
FOR(j,,a)dp[i+j][]=add(dp[i+j][],dp[i][]);
FOR(j,,b)dp[i+j][]=add(dp[i+j][],dp[i][]);
}
cout<<add(dp[n][],dp[n][])<<endl;
return ;
}
递推,求至少连续放置三个U的危险组合的更多相关文章
- NYOJ-301递推求值
递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f ...
- 算法笔记_091:蓝桥杯练习 递推求值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n- ...
- 查找至少连续出现三次的所有数字/连续3天的日期【LeetCode】
编写一个SQL查询,查找至少连续出现三次的所有数字.+----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | ...
- NYOJ——301递推求值(矩阵快速幂)
递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的 ...
- poj 3744 Scout YYF I(递推求期望)
poj 3744 Scout YYF I(递推求期望) 题链 题意:给出n个坑,一个人可能以p的概率一步一步地走,或者以1-p的概率跳过前面一步,问这个人安全通过的概率 解法: 递推式: 对于每个坑, ...
- Java实现 蓝桥杯 算法提高 递推求值
算法提高 递推求值 时间限制:1.0s 内存限制:256.0MB 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) ...
- Coin Toss(uva 10328,动态规划递推,限制条件,至少转至多,高精度)
有n张牌,求出至少有k张牌连续是正面的排列的种数.(1=<k<=n<=100) Toss is an important part of any event. When everyt ...
- poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 3523 Accepted: 1740 ...
- attack on titans(动态规划递推,限制条件,至少转至多方法,进击的巨人)
题目意思: 给n个士兵排队,每个士兵三种G.R.P可选,求至少有m个连续G士兵,最多有k个连续R士兵的排列的种数. 原题 Attack on Titans Time Limit: 2 Seconds ...
随机推荐
- JS-上下文练习
/** * 因为JS没有块级作用域,if里面的foo又是以var形式声明的,所以会被提升上去, * 被赋值为undefined,之后undefined代表false,所以会进入if语句块, * foo ...
- DX使用随记--GroupControl
1. 创建按钮: (1)添加引用:Imports DevExpress.XtraEditors.ButtonsPanelControl (2)添加按钮语句:GroupControl1.CustomHe ...
- python之atexit模块的使用
python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作. atexit 按 ...
- 1.IOC原理模拟
Spring两大核心功能,IOC(Inverse of Control) 和 AOP(Aspect-Oriented-Programming) IOC原理模拟: 有这样一个beans.xml: ...
- PMM 监控 MySQL 使用钉钉告警
打开 PMM Server 页面,如图所示点进Alerting --> Notification channels 输入钉钉的信息,并且 Save Test 测试结果,没问题了 如何使用 gra ...
- linux usb驱动记录(二)
三.usb设备的识别过程 在这里梳理一下上一篇博客中的内容:(这张图来自https://blog.csdn.net/lizuobin2/article/details/51931161) 上一篇博客刚 ...
- Python&Selenium 数据驱动【unittest+ddt+json】
一.摘要 本博文将介绍Python和Selenium做自动化测试的时候,基于unittest框架,借助ddt模块使用json文件作为数据文件作为测试输入,最后生成html测试报告 二.json文件 [ ...
- layui多图上传实现删除功能
在使用layui的多图上传时发现没有删除功能 在网上搜索解决办法时有的感觉太复杂有的不符合自己所需要的所以就自己动手 下面附上代码 HTML: <div class="layui-up ...
- udp广播,单播,多播
一.单播 (1)简介 两个节点之间的通信,一个发送者一个接收者 (2)特点 1.服务器及时响应客户机的请求. 2.服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务. 3.允许在Inter ...
- Zabbix Web 中文字体显示问题