E:Sleeping Schedule(DP)
或许更好的阅读体验
Sleeping Schedule
思路
这道题读题就感觉像时DPDPDP,读完题后更加坚定了,这是一道DPDPDP题目。
我们考虑状态转移方程,dp[i][j]dp[i][j]dp[i][j]表示在第iii次入睡时间是jjj的时候的时间最优值,所以显然有我们的状态转移方程就是
dp[i][(j+a[i])%n]=max((dp[i][j+a[i])%n),dp[i−1][j]+1dp[i][(j + a[i]) \% n] = max((dp[i][j + a[i]) \% n), dp[i - 1][j] + 1dp[i][(j+a[i])%n]=max((dp[i][j+a[i])%n),dp[i−1][j]+1,这里的j枚举的是上一次入睡的时间,因为是睡一天嘛,所以下一次睡觉的时间就是(j+a[i])%b(j + a[i]) \% b(j+a[i])%b
当然这里并没有考虑完备,因为我们还有一个时间时是(j+a[i]−1)%n(j + a[i] - 1) \% n(j+a[i]−1)%n,但是转移过程跟上面是一样的,这里就不多列式子了。
接下来我在代码里说一些我wa过得坑点。
代码
#include <bits/stdc++.h>using namespace std;typedef long long ll;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}const int N = 2e3 + 10;int dp[N][N], a[N], n, h, l, r;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false);n = read(), h = read(), l = read(), r = read();for(int i = 1; i <= n; i++)a[i] = read();memset(dp, -1, sizeof dp);//初始化,dp[0][0] = 0;//只有这个状态是合理的,所以初始化为0.for(int i = 1; i <= n; i++)for(int j = 0; j < h; j++) {//昨天是在j时入睡的,if(dp[i - 1][j] < 0) continue;//只能从上面一个合理的状态转移过来,所以上一个状态一定要满足是>= 0的,if((a[i] + j) % h >= l && (a[i] + j) % h <= r)//隔a[i]dp[i][(a[i] + j) % h] = max(dp[i][(a[i] + j) % h], dp[i - 1][j] + 1);elsedp[i][(a[i] + j) % h] = max(dp[i][(a[i] + j) % h], dp[i - 1][j]);if((a[i] + j - 1) % h >= l && (a[i] + j - 1) % h <= r)//隔a[i] - 1dp[i][(a[i] + j - 1) % h] = max(dp[i][(a[i] + j - 1) % h], dp[i - 1][j] + 1);elsedp[i][(a[i] + j - 1) % h] = max(dp[i][(a[i] + j - 1) % h], dp[i - 1][j]);}int ans = 0;for(int i = 0; i < h; i++)//从0 ~ h - 1枚举,并不是1 ~ n,这点一定注意。ans = max(ans, dp[n][i]);printf("%d\n", ans);return 0;
}
E:Sleeping Schedule(DP)相关推荐
- HDU 6170 2017 多校训练:Two strings(DP)
题意: 给你两个字符串:第一个字符串只包含小写大写字母 第二个字符串除了字母之外,还有'.'和'*',其中'.'可以当成任意一个字符,'*'表示前面那个字符可以重复若干次 当然也可以重复0次,例如a. ...
- HDOJ-2062 :Subset sequence(DP)
题目:求子集序列 Consider the aggregate An= { 1, 2, -, n }. For example, A1={1}, A3={1,2,3}. A subset sequen ...
- python【数据结构与算法】程序设计:划分整数(DP)
蒜头君特别喜欢数学.今天,蒜头君突发奇想:如果想要把一个正整数 nnn 分解成不多于 kkk 个正整数相加的形式,那么一共有多少种分解的方式呢? 蒜头君觉得这个问题实在是太难了,于是他想让你帮帮忙. ...
- E:K-periodic Garland(DP)
思路 每个点我们有两种决策,其值为0或1: 如果点我们放置0的话,我们有其前一位数字是零,或者其前一位数字是一. 如果这个点我们放置1的话,我们有其前面是按照每k个数字都出现一次1的排列,也有可能其前 ...
- 求三角形最大面积(DP)
求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...
- 设计模式:享元(FlyWeight)模式
设计模式:享元(FlyWeight)模式 一.前言 享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...
- LeetCode 1981. 最小化目标值与所选元素的差(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个大小为 m x n 的整数矩阵 mat 和一个整数 target . 从矩阵的 每一行 中选择一个整数,你的目标是 最小化 所有选中元素之 和 与 ...
- LeetCode 1824. 最少侧跳次数(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 n 的 3 跑道道路 ,它总共包含 n + 1 个 点 ,编号为 0 到 n . 一只青蛙从 0 号点第二条跑道 出发 ,它想要跳到点 n ...
- LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...
最新文章
- windows opensshd 连接就close_基于Windows白名单执行Payload上线Metasploit 渗透红队笔记...
- mongodb不等于某个值_MongoDb进阶实践之四 MongoDB查询命令详述
- 不是微型计算机主板上的部件,微型计算机主板上安装的主要部件
- 小程序 座位管理系统(一)(纯前端)
- MySQL批量SQL插入性能优化
- winfrom 点击按钮button弹框显示颜色集
- 可以买的一本书:3D计算机图形学(原书第3版)
- php中,多维数组是什么意思,在PHP中回显多维数组
- 约瑟芬公主把乔治放在了第三位,对吧
- 金额大小写转换(2)
- php buildconf,PHP Extension开发 Unix Build System配置 conf
- WIFI WDS不同应用模式简介
- 阿里云上云迁移工具案例实践:腾讯云迁移到阿里云
- android的退格字符,按键安卓版如何实现退格键功能
- 前端必会的 HTML+CSS 常用技巧 之 虚线的实现方式
- RK3588平台开发系列讲解(DisplayPort篇)DP相关模式说明
- WIN10下调用waveInOpen方法失败返回错误1的解决方法
- 线性表顺序存储的一些操作(初始化,添加,删除)
- 阿里大文娱——优酷场景化营销
- 开源CMS框架整理收集
热门文章
- 在杭州,吃过这60样东西,人生才算完美!
- 2017年终奖发放,程序员人均11776元排名第一!
- 明天放假,我放价!一个国庆假期教你学会数学建模
- Spark的基本架构
- 一些常用的SAS命令
- linux系统管理命令使用,Linux系统管理使用之基本命令(1)
- 一个问题让我直接闭门思过!!!拼多多面试必问项之List实现类:LinkedList
- matlab如何求矩阵的转置矩阵,怎么用MATLAB程序求转置矩阵?急需,高手帮忙………………...
- 两向量点乘坐标运算_高三数学冲刺复习之向量小题的题型总结(含好用的补充公式)...
- c#程序设计教程 唐大仕pdf_C# 添加PDF水印