不要连续1(动态规划)
链接:https://ac.nowcoder.com/acm/contest/79240/D
来源:牛客网
众所周知,15的二进制表示为1111,smallpear 想知道,给定二进制串长度为 \(n\) 的限制,有多少个数 \(x\) 的二进制在长度不超过 \(n\) 的情况下, 不存在有相邻的1。例如1010。
输入描述:
一行一个正整数 \(n\) ,其中 \(1\leq n\leq 20\)
输出描述:
输出一个整数,代表有多少个符合题意的 \(x\)
示例1
输入
2
输出
3
说明
0 ,1,2,共三个数,二进制表示分别为 00 01 10
这个题是个dp,
dp[i][0]表示前i个以0结尾的符合条件的个数
dp[i][1]表示前i个以1结尾的符合条件的个数
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e3+100;
typedef long long ll;
ll f[maxn][maxn];
int n;
void inint(){
f[1][0]=1;
f[1][1]=1;
for(int i=2;i<=n;i++){
f[i][0] = f[i - 1][0] + f[i - 1][1];
f[i][1] = f[i - 1][0];
}
}
int main(){
cin>>n;
inint();
cout<<f[n][0] + f[n][1];
}