超越学姐爱字符串

链接:https://ac.nowcoder.com/acm/contest/1114/A
来源:牛客网

题目描述

超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢“c”和“y”。因此超越学姐喜欢只含有“c”和“y”的字符串,且字符串中不能出现两个连续的“c”。请你求出有多少种长度为n的字符串是超越学姐喜欢的字符串。答案对1e9+7取模。

输入描述:

输入一个整数n。
1<=n<=100000

输出描述:

输出一个整数表示答案。
示例1

输入

复制
3

输出

复制
5

说明

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;
}

 

posted @ 2019-10-17 17:00  晴天要下雨  阅读(147)  评论(0编辑  收藏  举报