链接:https://ac.nowcoder.com/acm/contest/1114/A
来源:牛客网
题目描述
超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢“c”和“y”。因此超越学姐喜欢只含有“c”和“y”的字符串,且字符串中不能出现两个连续的“c”。请你求出有多少种长度为n的字符串是超越学姐喜欢的字符串。答案对1e9+7取模。
输入描述:
输入一个整数n。
1<=n<=100000
输出描述:
输出一个整数表示答案。
示例1
说明
cyy,cyc,yyy,yyc,ycy
思路:一个长度为n的字符串,只能有c和y。很容易往排列组合方面想,但是写不出来。。。。。
换一个方法,这个串只能由c和y组成,那么从n等于1到n每次在末尾加一个字符,可以是c也可以是y。第n为为c,只能和n-1位为y的串组和。第n位为y,可以和第n-1位c和y的串组合。
设1为c,0为y
可以得出状态转移方程
d[i][1]=d[i-1][0]
d[i][0]=(d[i-1][0]+d[i-1][1])
dp实现
#include <iostream> using namespace std; const long long p =1e9+7; long long d[100000][2]; int main() { int n; cin >> n; d[1][1]=1; d[1][0]=1; for(int i=2;i<=n;i++) { d[i][1]=d[i-1][0]%p; d[i][0]=(d[i-1][0]+d[i-1][1])%p; } cout << (d[n][0]+d[n][1])%p << endl; return 0; }
斐波那契数列
思路:n=1,ans=2;
n=2,ans=3;
n=3,ans=5;
n=4,ans=8
#include <iostream> using namespace std; const long long p =1e9+7; long long d[100005]; int main() { int n; cin >> n; d[1]=2; d[2]=3; for(int i=3;i<=n;i++) { d[i]=(d[i-1]+d[i-2])%p; } cout << d[n] << endl; return 0; }