家庭作业

DP训练题

题目描述

老师布置了$N$道作业题,题目编号$0$~$N-1$。编号0的题目必须做。如果做了第 $i$ 题,则第 $i + 1$题可做也可不做,直接跳到第 $i + 2$ 题。但不允许一次跳过超过一道题。

例如, ${0, 2, 3, 5}$ 是合法的,而 ${0, 2, 4, 7}$ 是非法的,因为中间跳过的题目太多了。 做了一道题将得到一个快乐值$happy[i]$。当做过的题目的最大快乐值减最小快乐值达到某个阈值$d$时,就可以停止做题。

如果达不到阈值,则需要做全部的题目。

求最少做题数量。

输入格式

第1行:1个整数N,表示作业题数

第2行:N个整数,表示快乐值

第3行:1个整数d,表示阈值

输出格式

第1行:1个整数,表示最少做题数量

数据范围与提示

$N <= 50$ ,$happy[i] <= 1000$

难点

状态如何定义?

状态

$f[i][j][k]$表示前 $i$ 题中,$i$题一定做,快乐值最小为第 $j$ 题,最大为 $k$题,如果不做,则标记为 $0$

转移

if(a[k]-a[j]>=d) ans=min(ans,f[i][j][k]);
for(int x=i+1;x<=i+2&&x<=n;x++){
    int y=j,z=k;
    if(a[x]<a[y]) y=x;
    if(a[x]>a[z]) z=x;
    if(f[x][y][z]==0||f[x][y][z]>f[i][j][k]+1)f[x][y][z]=f[i][j][k]+1;
}
posted @ 2023-05-03 08:45  固态H2O  阅读(2)  评论(0编辑  收藏  举报  来源