[CSP-S模拟测试]:花(DP)
题目传送门(内部题111)
输入格式
一个整数$T$,表示测试数据组数。
每组测试数据占一行,两个整数,分别表示$L$和$S$。
输出格式
对每组数据,输出一个整数表示答案。
样例
样例输入1:
1
3 7
样例输出1:
7
样例输入2:
2
4 2
10 11
样例输出2:
4
410199993
数据范围与提示
样例$1$解释:
一共有$7$种形态,每种形态能构成$1$个方案。
样例$2$解释:
AAAB
ABBB
BAAA
BBBA
数据范围:
对于$60\%$的数据,$L\leqslant 30,S\leqslant 26$。
对于$80\%$的数据,$L\leqslant 10,000,S\leqslant 26$。
对于$100\%$的数据,$L\leqslant 100,000,S\leqslant 100,000$。
题解
不给暴力分,导致考场许多想偏了的$dalao$直播$TLE0$……
考虑$DP$。
先来考虑$80$分的做法。
因为在处理当前位的时候只与最后两位有关系,于是我们可以设$dp[i][j][k][0/1]$表示处理到$i$,当前位是$k$,上一位为$j$,是否已经出现过三连的方案数。
转移很暴力,枚举$j,k$,再枚举当前位是什么就好了。
发现形态只有相同与不同,而与具体是哪种情况无关,于是考虑换一个状态定义,说一下我的做法,与题解略有不同,设$dp[i][0/1][0/1]$表示处理到$i$,是否与上一位相同,是否出现过三连即可。
下面给出四个状态转移方程:
$\alpha.dp[i][0][0]=(dp[i-1][0][0]+dp[i-1][1][0])\times (S-1)$:可以由上一位二连或不是二连转移过来,只要与上一位不同即可,所以要乘上$(S-1)$;但是不能三连边没有。
$\beta.dp[i][0][1]=(dp[i-1][0][1]+dp[i-1][1][1])\times (S-1)$:不能创造三连,只能继承上面的三连,$(S-1)$与上式同理。
$\gamma.dp[i][1][0]=dp[i-1][0][0]$:只能由上一位没有二连转移过来,否则会出现三连,那么第三维就不能是$0$了。
$\delta.dp[i][1][1]=dp[i-1][0][1]+dp[i-1][1][0]$:这次可以继承前面的三连,但是注意不能再出现三连;还可以创造三连,这时候需要上一位是二连。
时间复杂度:$\Theta(n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
int L,S;
long long dp[100001][2][2];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&L,&S);
memset(dp,0,sizeof(dp));
dp[2][0][0]=1LL*S*(S-1)%mod;
dp[2][1][0]=S;
for(int i=3;i<=L;i++)
{
dp[i][0][0]=(dp[i-1][0][0]+dp[i-1][1][0])%mod*(S-1)%mod;
dp[i][0][1]=(dp[i-1][0][1]+dp[i-1][1][1])%mod*(S-1)%mod;
dp[i][1][0]=dp[i-1][0][0];
dp[i][1][1]=(dp[i-1][0][1]+dp[i-1][1][0])%mod;
}
printf("%lld\n",(dp[L][0][1]+dp[L][1][1])%mod);
}
return 0;
}
rp++
[CSP-S模拟测试]:花(DP)的更多相关文章
- csp-s模拟测试97
csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania
[2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...
- noi2019模拟测试赛(四十七)
noi2019模拟测试赛(四十七) T1与运算(and) 题意: 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- csp-s模拟测试98
csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...
- csp-s模拟测试95
csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...
随机推荐
- PB动态游标代码段
sql = "select p_partno from p_partno_rm group by p_partno order by p_partno"declare my3 d ...
- Tomcat 设置80端口
1:修改tomcat配置 vi /usr/local/tomcat/conf/server.xml 找到 Connector port="8080" protocol=" ...
- 多列表zip合并的csv持久化储存
有时xpath爬取数据之后会返回多个列表,这些列表的长度一样,这时候可以用zip()合并,然后返回一个zip对象,直接传入储存函数,进行持久化储存 例如: name=['张三','李四','王五'] ...
- springboot配置文件之yml的语法学习
springboot配置文件(.yml/.yaml.properties) YAML(YAML Ain't Markup Language) YAML A Markup Language:是一个标记语 ...
- 07 Python爬虫验证码处理
大部分门户网站在进行登录的时候,如果用户连续登录的次数超过3次或者5次的时候,就会在登录页中动态生成验证码.通过验证码达到分流和反爬的效果. 一. 云打码平台处理验证码的流程: 1.对携带验证码的页面 ...
- 数据绘图工具之Matplotlib
一.安装:绘图和可视化 pip install matplotlib 我们已经下好了anaconda 包含了绘图工具包 直接导入即可 import matplotlib.pyplotlib as pl ...
- Django的orm练习
models(创建表): class Grade(models.Model): """年级表""" gname=models.CharFie ...
- 用Ant实现Java项目的自动构建和部署(转载以作收藏)
原文地址:http://tech.it168.com/j/2007-11-09/200711091344781.shtml 本文请勿转载! Ant是一个Apache基金会下的跨平台的构件 ...
- tomcat访问日志
* %a - Remote IP address # 远程ip地址 * %A - Local IP address # 本地ip地址 * %b - Bytes sent, excluding HTTP ...
- 解决Jenkins忘记用户名,密码
windows系统: 进入windows默认目录 C:\Users\Administrator\.jenkins\users 修改配置文件即可