不要连续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];
}
posted @ 2024-04-08 11:04  lipu123  阅读(9)  评论(0)    收藏  举报