题干:

winterzz1准备考4级了,现在winterzz1决定把世界上所有单词都背一遍,winterzz1发现任意一个单词最多有A个连续的元音,最多有B个连续的辅音。且单词最长长度为N,winterzz1问你在满打满算的情况他需要背多少单词???

输入描述:

首先输入一个T(T<=100),表示有T组案例,每组案例依次输入三个正整数N,A,B,N<=5000,A<=50,B<=50;

输出描述:

输出winterzz1最多需要背多少单词,结果mod(10^9+7)

示例1

输入

复制

2
2 2 2
500 20 30

输出

复制

702
175540856

备注:

元音字母为a,e,i,o,u,其余21个字母均为辅音

解题报告:

这题不算难其实。。。dp[i][j][k]就完事了。。。不过超时了10多次后发现是因为mod运算了太多次了,,把mod改成const就火速AC了、、、好气啊、、不过可能是因为dp的姿势不太正确,,应该可以先记忆下来然后快速幂直接解决一下。。

这题抽象出来的意思就是:长度为n的01串,其中连续1的个数不能超过x个,连续0的个数不能超过y个。给定n,x,y,问能构造出多少合法串。。然后再加强一下:对0和1,有两个对应的权值,,这就变成这道题了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#include<ctime>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll dp[5005][2][55];//0代表元音,1代表辅音
const ll mod = 1e9+7;
int n,a,b;
int main()
{int t;scanf("%d",&t);while(t--) {scanf("%d%d%d",&n,&a,&b);int up = max(a,b);for(int i = 0; i<=n; i++) {for(int j = 0; j<=50; j++) {dp[i][0][j]=dp[i][1][j]=0;//别只初始化到up,,因为有可能上次的up更大,所以没有初始化完全。。。}}if(n == 1) {puts("26");continue;}dp[1][0][1]=5;dp[1][1][1]=21;for(int i = 2; i<=n; i++) {//更新元音的for(int j = 1; j<=min(i-1,b); j++) dp[i][0][1] = (dp[i][0][1] + dp[i-1][1][j]*5ll%mod)%mod;for(int j = 2; j<=min(i,a); j++) dp[i][0][j] += dp[i-1][0][j-1]*5%mod;//更新辅音的for(int j = 1; j<=min(i-1,a); j++) dp[i][1][1] = (dp[i][1][1]+dp[i-1][0][j]*21%mod)%mod;for(int j = 2; j<=min(i,b); j++) dp[i][1][j] += dp[i-1][1][j-1]*21%mod;}ll ans = 0;for(int i = 1; i<=n; i++) {for(int j = 1; j<=50; j++) {if(j <= a) ans = (ans + dp[i][0][j])%mod;if(j <= b) ans = (ans + dp[i][1][j])%mod;}}printf("%lld\n",ans);}return 0 ;}
/*
2
2 2 2
500 20 30
*/

还有一个10msAC的代码,(以后再补一下吧、、):

(这个代码大概意思就是先dp[i][j]算出所有的,再减去连续a个元音的,或者连续b个辅音的,,也不算难想到啊其实,不知道比赛的时候在干什么。。唉可能还是自己苔菜了、、)

#include<bits/stdc++.h>
using namespace std;
using LL=unsigned long long;
const int M=6e3+5;
const int mo=1e9+7;
LL dp[M][2],cnt[M];
LL qpow(LL a,LL b)
{LL res=1;while(b>0){if(b&1)res=res*a%mo;b>>=1;a=a*a%mo;}return res;
}
int main()
{int t;scanf("%d",&t);while(t--){int n,a,b;scanf("%d%d%d",&n,&a,&b);for(int i=1;i<=n;i++)dp[i][0]=dp[i][1]=0;dp[0][0]=dp[0][1]=1;dp[1][0]=5;dp[1][1]=21;cnt[1]=26;LL pa=qpow(5,a+1),pb=qpow(21,b+1),res=26;// cout<<pa<<"=="<<pb<<endl;for(int i=2;i<=n;i++){dp[i][0]=5*cnt[i-1]%mo;dp[i][1]=21*cnt[i-1]%mo;if(i>a)dp[i][0]=(dp[i][0]-dp[i-a-1][1]*pa%mo+mo)%mo;if(i>b)dp[i][1]=(dp[i][1]-dp[i-b-1][0]*pb%mo+mo)%mo;cnt[i]=(dp[i][0]+dp[i][1])%mo;res=(cnt[i]+res)%mo;}printf("%lld\n",res);}return 0;
}

*【牛客 - 326B】背单词(线性dp)相关推荐

  1. 【牛客 - 157F】三轮(dp,分治fft)

    题干: 链接:https://ac.nowcoder.com/acm/contest/157/F 来源:牛客网 小k有一个三轮,它最多可以装105大小的东西 小k有n种商品,他要准备出摊了 每种商品体 ...

  2. 牛客 - WY28 跳石板 (dp)

    牛客 解题思路: 将1 - M个石板看做一个结果数组stepNum,每个stepNum[i]储存着从起点到这一步最小的步数,其中0为不 能到达. 从起点开始对stepNum进行遍历,先求i的所有约数( ...

  3. 牛客 - 血压游戏(虚树+dp)

    题目链接:点击查看 题目大意:中文题,不难理解 题目分析:这个题目比赛的时候没来得及看,比赛结束后看到有大佬写了一篇长链剖分+线段树的题解就被吓到了(主要是感觉太麻烦了,懒得去补了),读完题后总感觉似 ...

  4. 牛客 - 第k小数(线性寻找第 k 小数)

    题目链接:点击查看 题目大意:给出长度为 n 的数列 a ,要求找到第 k 小的数 题目分析:因为数据给的足够大,所以约束就是必须线性完成操作,STL 中的 nth_element() 函数可以完美实 ...

  5. 牛客 - 数位操作2(数位dp)

    题目链接:点击查看 题目大意: 给了你一个极端大的数据集合的信息 N, SUM, X 如下 这个数据集合里面的N位, 每一数位求和之后刚好等于SUM (比如四位数 1234 数位求和之后是 10); ...

  6. 牛客 - 张老师的旅行(dp)

    题目链接:点击查看 题目大意:中文题面 题目分析:最优性问题,读完题后感觉不是最短路就是 dp 了,喊队友读了一遍题后确定是 dp 了 n 只有 1e3 ,所以可以支持二维 dp 的定义,因为涉及到数 ...

  7. 牛客 - 树上求和(贪心+树形dp)

    题目链接:点击查看 题目大意:给出一棵树,现在要求给每条边赋上 0 ~ n - 1 的值,且不重复,规定每条路径 ( u , v ) 的权值和为其简单路径上的边权之和,而整棵树的权值和为 所有简单路径 ...

  8. 牛客 - 汉诺塔(思维+dp)

    题目链接:点击查看 题目大意:给出 n 个木板,尺寸分别为 Xi * Yi ,现在要求将其分为最少的组,每一个组中都可以通过重新排序使得每个木板都严格递增,此处递增的意思为严格满足 Xi > X ...

  9. 牛客 - 17968 - xor序列 - 线性基

    https://ac.nowcoder.com/acm/problem/17968 下面是错误的做法,因为题目要求必须使用x,而y在check的时候不一定用到等价于x的线性基来构成. 正确的做法是直接 ...

最新文章

  1. 互联网大佬口口声声的人工智能,笑到最后的也许是马云的云计算
  2. 前瞻:在 Java 16 中会带来哪些新特性?
  3. Handlebars模板库浅析
  4. formal method online checking tool
  5. c++中的 extern C
  6. c++STL容器的Set和multiset
  7. 【报错笔记】在eclipse中复制代码后代码中会报画红线错,而且项目也会报错。
  8. 禅道项目管理_禅道项目管理软件 v12.5.1 开源版
  9. Datawhale组队-Pandas(下)分类数据(打卡)
  10. 02.友盟项目--原始日志数据生成
  11. PAT 乙级 1034. 有理数四则运算(20) Java版
  12. [lua]紫猫lua教程-命令宝典-L1-01-11. lua的个人补充
  13. 项目管理-----整合项目资源
  14. 网页实现中英文切换方式对比与实现
  15. 第三只眼与另一个世界
  16. 一行代码深度定制你的专属二维码:(amzqr、MyQR制作动态二维码)
  17. 经济学人精读笔记17:无现金时代,电子支付大势所趋
  18. Apache Lucene - Building and Installing the Basic Demo
  19. 农村的我在1024分享开始杭漂的经历和心酸,我们一起共勉~
  20. 史上最详细Maven笔记以及搭建Nexus私服

热门文章

  1. 2.3 Factory Method(工厂方法)
  2. [Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]
  3. Levko and Permutation CodeForces - 361B 思维 数论
  4. 新疆农业大学计算机科学与技术专业怎么样,新疆农业大学计算机科学与技术专业2016年在新疆理科高考录取最低分数线...
  5. mysql分库一致性_分库分表带来的完整性和一致性问题
  6. redis实现轮询算法_【07期】Redis中是如何实现分布式锁的?
  7. html页面 wordpress,WordPress纯代码实现前端页面HTML完美压缩
  8. Jenkins主从节点配置
  9. gsoap的几个常用设置选项
  10. linux内核中分配4M以上大内存的方法