[牛客练习赛53] A.超越学姐爱字符串 [dp]

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

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

输入描述:

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

输出描述:

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

输入

复制
3

输出

复制
5

说明

cyy,cyc,yyy,yyc,ycy

题解:
  挺简单的一道DP题,dp[i][0]表示前i位、第i位为c的数量,dp[i][1]表示前i位、第i位为y的数量,则
    dp[i][0] = dp[i-1][1]; (第i位为c,第i-1位必须为y)
    dp[i][1] = dp[i-1][0] + dp[i-1][1](第i位为y,第i-1位可以是c/y)
  
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
ll dp[100005][2];
int main(){
    ll n;
    scanf("%lld",&n);
    dp[1][0] = dp[1][1] = 1;
    for (int i = 2;i <= n;++i){
        dp[i][0] = dp[i-1][1];
        dp[i][1] = (dp[i-1][0] + dp[i-1][1]) % mod;
    }
    printf("%lld\n",(dp[n][1] + dp[n][0])%mod);
    
}
n = int(input())
dp=[[0]*2 for i in range(n+1)]
dp[1][0] = 1
dp[1][1] = 1
k = int(1e9+7)
for i in range(2,n+1):
    dp[i][0] = dp[i-1][1]
    dp[i][1] = (dp[i-1][0] + dp[i-1][1]) % k
print((dp[n][0]+dp[n][1]) % k)
有趣的是比赛结束后看了眼别人的代码,发现本题其实是Fibonacci数列。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector<int> memo;
#define mod 1000000007
int main() {/// 斐波那契数列
    int x;
    scanf("%d",&x);
    memo = vector<int>(x+1,-1);
    memo[0]=0;
    memo[1]=2;
    memo[2] = 3;
    for(int i=3;i<=x;i++)
    {
        memo[i]=memo[i-1]+memo[i-2];
        memo[i]%=mod;
    }
    cout<<memo[x]<<endl;
    return 0;
}

 

 

posted @ 2019-10-12 11:46  mizersy  阅读(327)  评论(0编辑  收藏  举报