题意:给你一个长为L的圆形跑道,让你放置警示牌,相邻两个警示牌相隔距离不能超过S,让你求有多少种方案数放置。数据L,S都是1e6。

来个例子:L = 13, S = 5。一个圈表示长度为1。

思路:因为是一个圈,我们必须得判断最后一个牌子和第一个牌子的相距距离,所以如果我们规定了第一个放在那,最后一个放在那,这道题就简单多了。比如这个。

第一步思考:

1 当我们第一个放在1号位子时,我们最后一个能放的位置有12,13,14,15,16。

2 当我们第一个放在2号位子时,我们最后一个能放的位置有13,14,15,16。

3 当我们第一个放在3号位子时,我们最后一个能放的位置有14,15,16。

4 当我们第一个放在4号位子时,我们最后一个能放的位置有15,16。

5 当我们第一个放在5号位子时,我们最后一个能放的位置只有16。

6 当我们第一个放在6号位子时,不行,因为最大不能相差6,如果放在了6,我们得在1到5之间放置一个警示牌,和前面的情况已经重复了。

第二步思考:

确定了第一个位子和最后一个位子,你只需要确定中间能放置的种类不久行了吗?然后你想一会会发现这不就是求一个直行跑道放警示牌能放多少种吗?最多不能相隔s,你刚开始做dp时,每次上台阶你只能上1或者2阶,n阶的楼梯你可以走的方案数有多少种?这个题不就是你每次可以走1~S阶,求走n阶的方案数么?你的dp[i]表示的就是长度为i,在第i这个地方放置一个牌子的方案数。 所以dp[i]就等于dp[i-1]+dp[i-2]....+dp[i-s+1]啊。这不就写出来了吗?

需要注意的是,长度为三的,是有4个点,因为0可以放。

正常写是这样

dp[0] = 1;
for(int i = 1; i <= l; i++){
for(int j = i-1; j >= max(0, i-s); j--){
(dp[i] += dp[j]) %= mod;
}
}

但是复杂度肯定说不过去,再一想你想要的只不过要维护一个长为s的区间和而已,所以直接记录前s个的前缀和,然后每次加一个是,减去你维护的区间第一个值就行了。

    dp[0] = now = 1;
for(int i = 1; i <= l; i++){
dp[i] = now;
(now += dp[i]) %= mod;
if(i >= s){ //维护长度为s的区间和。
now = (now - dp[i-s] + mod) % mod;
}
}

还记得第一步吗?

我们要的答案就是这些的对应位置的dp值相加。

就变成了:

1 当我们第一个放在1号位子时,我们最后一个能放的方案数有dp[11] + dp[12] + dp[13] + dp[14] + dp[15]

2 当我们第一个放在2号位子时,我们最后一个能放的方案数有dp[11] + dp[12] + dp[13] + dp[14]

3 当我们第一个放在3号位子时,我们最后一个能放的方案数有dp[11] + dp[12] + dp[13]

4 当我们第一个放在4号位子时,我们最后一个能放的方案数有dp[11] + dp[12]

5 当我们第一个放在5号位子时,我们最后一个能放的方案数有dp[11]

再开一个数组记录dp的前缀和就能直接算了。

这题就a了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 123456789;
const int maxn = 1e6 + 5;
ll dp[maxn], sum[maxn];
int main(){
ll l, s;
cin >> l >> s;
ll now = 1;
dp[0] = 1;
sum[0] = 1;
for(int i = 1; i <= l; i++){
dp[i] = now;
sum[i] = (sum[i-1]+dp[i]) % mod; // 前缀和
(now += dp[i]) %= mod;
if(i >= s){
now = (now - dp[i-s] + mod) % mod;
}
}
ll ans = 0;
for(int i = 1; i <= s; i++){
ans = (ans + sum[l-i] - sum[l-s-1] + mod)%mod;
}
cout << ans << endl;
return 0;
}

Gym 101490K Safe Racing (dp转换, 超超超级详细,包你看懂)的更多相关文章

  1. 问题 L: 超超的中等意思

    问题 L: 超超的中等意思 时间限制: 1 Sec  内存限制: 128 MB提交: 366  解决: 27[提交] [状态] [命题人:jsu_admin] 题目描述 已知p,q,k和一个难搞得多项 ...

  2. 问题 F: 超超的自闭意思

    问题 F: 超超的自闭意思 时间限制: 1 Sec  内存限制: 128 MB提交: 80  解决: 10[提交] [状态] [命题人:jsu_admin] 题目描述 质数定义为在大于1的自然数中,除 ...

  3. (原创)超详细一步一步在eclipse中配置Struts2环境,无基础也能看懂

    (原创)超详细一步一步在eclipse中配置Struts2环境,无基础也能看懂 1. 在官网https://struts.apache.org下载Struts2,建议下载2.3系列版本.从图中可以看出 ...

  4. 利用树莓派来安装opencv从而来调动摄像头工作(没有坑,超超自己试过)

    超超最近参加了学校里一位特别厉害的老师讲的课(两天,我就从一个小白然后了解了树莓派以及Arduino这些我之前都没有了解过的东西,由于结课的需要,我们需要自己设计一个创意以及完成作品)所以才有了这篇文 ...

  5. 水题 Gym 100553K Knockout Racing

    题目传送门 /* 题意:有若干个点在一个区间内来回移动,1m/s. 水题:n^2的复杂度能解决,注意时间可能大于一个周期,要取模 */ #include <cstdio> #include ...

  6. UVA - 825Walking on the Safe Side(dp)

    id=19217">称号: UVA - 825Walking on the Safe Side(dp) 题目大意:给出一个n * m的矩阵.起点是1 * 1,终点是n * m.这个矩阵 ...

  7. 对于挑战书上的很久之前都看不懂的DP看懂的突破

    突破一..牢记问题概念 并且牢记dp状态方程 突破二..一直有一个求和dp转化成O1dp递推的式子看不懂.. 看不懂的原因是..没有分清求和符号作用的范围 提醒:以后遇到求和符号一定明确其求和的式子的 ...

  8. 小学生都能看懂的数位dp

    前言 数位dp其实很久前就知道了,也做过几道和其他算法混在一起的题目,其实通过手玩是能做的 但毕竟是种算法,还是系统学下比较好(节省手玩时间) 模板题 P2602 [ZJOI2010]数字计数 化简题 ...

  9. JS 时间处理(GMT转换,超24小时加一天,时间差计算)

    计算天数,加小时,加分数 Date.prototype.Format = function (fmt) { // author: meizz var o = { "M+": thi ...

  10. Codeforces Gym 100231L Intervals 数位DP

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description Start with an integer, N0, ...

随机推荐

  1. pytorch学习笔记(6)--神经网络非线性激活

    如果神经元的输出是输入的线性函数,而线性函数之间的嵌套任然会得到线性函数.如果不加非线性函数处理,那么最终得到的仍然是线性函数.所以需要在神经网络中引入非线性激活函数. 常见的非线性激活函数主要包括S ...

  2. pg_freespacemap查看表膨胀

    pg_freespacemap模块提供一种检查自由空间映射(FSM)的手段.它提供一个名为pg_freespace的函数,或精确的说是两个重载函数.该函数在一个给定的页面或关系中的所有页面的自由空间映 ...

  3. 逆向学习物联网-网关ESP8266-00课程目的

  4. noi 1.1 2 输出第二个整数

    描述 输入三个整数,把第二个输入的整数输出. 输入 只有一行,共三个整数,整数之间由一个空格分隔.整数是32位有符号整数. 输出 只有一行,一个整数,即输入的第二个整数. 样例输入 123 456 7 ...

  5. Ansible AWX

    Ansible简介 ansible是一个非常简单的it自动化平台,使得程序和系统更易于部署.ansible本质是一个进行封装的shell,优点在于它是去中心化的工具,可以直接通过ssh远程管理主机,实 ...

  6. NPM镜像代理设置

    用户目录C:\Users\xxx下建立.npmrc文件,内容如下: registry="https://registry.npm.taobao.org" ELECTRON_MIRR ...

  7. 动手搭建ssm框架

    现在很多公司用的开源框架很多都是ssm框架的一个结构,这里我自己试着自己搭一个简单的框架,大家共同学习.下面一起跟着我搭建吧,本人菜鸟,有任何不对的地方有望指出. 框架结构:spring(4.3.9. ...

  8. 基础篇二:Linux常用系统命令

    Linux常用系统命令 pwd 打印当前目录 cd /目录 切换目录 cd ..   切换上一级目录 ls 显示目录 ls -a  包括隐藏文件 ls -l 以长格式列出 alias 当前系统所有别名 ...

  9. oracle 白名单作用及配置教程

    出于提高数据安全性等目地,我们可能想要对oracle的访问进行限制,允许一些IP连接数据库或拒绝一些IP访问数据库. 当然使用iptables也能达到限制的目地,但是从监听端口变更限制仍可生效.只针对 ...

  10. PC端钉钉扫码登录,报错情况合集

    "对不起 你无权限查看该页面 redirect_url不能为空" 原因: 1. 只对redirect_url编码,而生成二维码时需要对整个gotoUrl进行编码 2. appid参 ...