E. Sleeping Schedule(记忆化搜索)

简介: E. Sleeping Schedule(记忆化搜索)

题目

题意

  • 输入 n(≤2000) h L R (0≤L≤R<h≤2000) 和长为 n 的数组 a(1≤a[i]<h)。
  • 对于每个 a[i],你可以把它减一,或者保持不变(换句话说,每个 a[i] 至多 -1 一次)。
  • 定义前缀和 s[0]=a[0], s[i]=s[i-1]+a[i]。
  • 如果 s[i]%h 落在闭区间 [L,R] 内,则分数加一。
  • 最大化分数。

思路

  • 定义dfs(i,j)为第i次睡觉的时间为j的最大分数
  • 转移dfs(i,j) = max(dfs(t1,s+1) + (t1 >= l && t1 <= r),dfs(t2,s+1) + (t2 >= l && t2 <= r));
  • 观察每个数字转移的时候,可以减一或者不减一,那么很明显,对于一个中间阶段有太多的重复到达的方式
  • 所以记忆化搜索很容易写,也可以直接递推[codeforces.com/blog/entry/…

代码

ini

复制代码

const double eps = 1e-6;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int N = 2010;
int a[N];
int f[N][N];//count
int n,h,l,r;
int dfs(int t,int s)
{
    if(s > n)return 0;
    if(f[t][s] != -1)return f[t][s];
    int t1 = (t + a[s]) % h,t2 = (t + a[s] + h - 1) % h;
    return f[t][s] = max(dfs(t1,s+1) + (t1 >= l && t1 <= r),dfs(t2,s+1) + (t2 >= l && t2 <= r));
}
void solve() 
{
    cin >> n >> h >> l >> r;
    for(int i = 1;i <= n;i ++)cin >> a[i];
    memset(f,-1,sizeof f);
    cout << dfs(0,1) << endl;
}


相关文章
|
4月前
|
Kubernetes API 调度
在k8S中,Scheduler作用及实现原理是什么?
在k8S中,Scheduler作用及实现原理是什么?
|
6月前
|
Kubernetes 监控 调度
K8S中Scheduler原理分析
【6月更文挑战第20天】K8S Scheduler是集群的关键组件,它监听API Server,为新Pod选择合适的Node。
|
Kubernetes 算法 调度
基于kube-scheduler-simulator编写自己的调度程序
基于kube-scheduler-simulator编写自己的调度程序
156 0
|
调度
RxSwift调度器 - Schedulers
RxSwift调度器 - Schedulers
96 1
|
索引
LeetCode 207. Course Schedule
现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?
89 0
LeetCode 207. Course Schedule
codeforces1324——E.Sleeping Schedule(DP+初始化)
codeforces1324——E.Sleeping Schedule(DP+初始化)
105 0
codeforces1324——E.Sleeping Schedule(DP+初始化)
|
Java 调度
Leetcode-Medium 621. Task Scheduler
Leetcode-Medium 621. Task Scheduler
118 0
Leetcode-Medium 621. Task Scheduler
[P3074 | USACO13FEB] Milk Scheduling | SPFA最长路 | 超级源点 + 超级汇点
题意: 一共有n头奶牛,每头奶牛挤奶都会消耗一定的时间ti 然后有m 个关系,u − v,其含义是 u 必须在v 之前挤奶,而且有足够的人手多线程挤奶,问为这n 头奶牛挤完奶一共需要消耗多长时间
171 0
|
机器学习/深度学习 算法 Java