[牛客练习赛53] A.超越学姐爱字符串 [dp]
链接:https://ac.nowcoder.com/acm/contest/1114/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢“c”和“y”。因此超越学姐喜欢只含有“c”和“y”的字符串,且字符串中不能出现两个连续的“c”。请你求出有多少种长度为n的字符串是超越学姐喜欢的字符串。答案对1e9+7取模。
输入描述:
输入一个整数n。
1<=n<=100000
输出描述:
输出一个整数表示答案。
示例1
说明
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; }