erewrwerwer

 erewrwerwer

时间限制: 1 Sec  内存限制: 512 MB

题目描述

给你一个字符串,请问其有多少个子序列为erewrwerwer

输入格式:

一行一个字符串,由小写字母’e’、’w’或者’r’组成

输出格式:

一行一个整数,表示为erewrwerwer的子序列数,模1e9+7

样例输入:

erewrwerwererewrwerwer

样例输出:

260

 

数据范围与约定:

设n为字符串长度

对于前%20的数据,n<=11

对于另外%30的数据,n<=20

对于%100的数据,n<=100000

 solution:

    极其水的一个题,明显dp(然而考试上来打了个暴搜),f[i][j]表示表示到字符串中第i个位置匹配子串到第j个位置的方案数,位于特定位置上的可以往下转移就转移,答案为f[n][11]。

    

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 #define mod 1000000007
 7 int ans,len;
 8 char s[100005];
 9 long long f[100005][12];
10 int main() {
11     scanf("%s",s+1);
12     len=strlen(s+1);
13     for(int i=1; i<=len; ++i) {
14         for(int j=1; j<=11; ++j) {
15             f[i][j]=f[i-1][j];
16         }
17         if(s[i]=='e') {
18             f[i][1]=(1+f[i-1][1])%mod;
19             f[i][3]=(f[i][3]+f[i-1][2])%mod;
20             f[i][7]=(f[i][7]+f[i-1][6])%mod;
21             f[i][10]=(f[i][10]+f[i-1][9])%mod;
22         }
23         if(s[i]=='r') {
24             f[i][2]=(f[i][2]+f[i-1][1])%mod;
25             f[i][5]=(f[i][5]+f[i-1][4])%mod;
26             f[i][8]=(f[i][8]+f[i-1][7])%mod;
27             f[i][11]=(f[i][11]+f[i-1][10])%mod;
28         }
29         if(s[i]=='w') {
30             f[i][4]=(f[i][4]+f[i-1][3])%mod;
31             f[i][6]=(f[i][6]+f[i-1][5])%mod;
32             f[i][9]=(f[i][9]+f[i-1][8])%mod;
33         }
34     }
35     cout<<(f[len][11]%mod);
36     fclose(stdin);
37     fclose(stdout);
38     return 0;
39 }

 

 

 

posted @ 2017-08-20 11:09  Forever_goodboy  阅读(292)  评论(0编辑  收藏  举报