题意描述
小 T 同学非常热衷于跑步。为了让跑步更加有趣,他决定制作一款叫做《天天爱打卡》的软件,使得用户每天都可以进行跑步打卡。
开发完成后,小 T 同学计划进行试运行,他找了大 Y 同学来帮忙。试运行共 nnn 天,编号为从 111 到 nnn。
对大 Y 同学来说,如果某天他选择跑步打卡,那么他的能量值会减少 ddd。初始时,他的能量值是 000,并且试运行期间他的能量值可以是负数。
而且大 Y 不会连续跑步打卡超过 kkk 天;即不能存在 1≤x≤n−k1\le x\le n-k1≤x≤n−k,使得他在第 xxx 到第 x+kx+kx+k 天均进行了跑步打卡。
小 T 同学在软件中设计了 mmm 个挑战,第 iii(1≤i≤m1\le i \le m1≤i≤m)个挑战可以用三个正整数 (xi,yi,vi)(x_i,y_i,v_i)(xi,yi,vi) 描述,表示如果在第 xix_ixi 天时,用户已经连续跑步打卡至少 yiy_iyi 天(即第 xi−yi+1x_i-y_i+1xi−yi+1 到第 xix_ixi 天均完成了跑步打卡),那么小 T 同学就会请用户吃饭,从而使用户的能量值提高 viv_ivi。
现在大 Y 想知道,在软件试运行的 nnn 天结束后,他的能量值最高可以达到多少?
题解
考场上没时间写离散化,100→56100\to56100→56,警惕看错时间仙人。
8pts做法
爆搜进行哪个挑战,判断下是否满足要求即可。
时间复杂度 O(2n) O(n2n)O(2^n)~O(n2^n)O(2n) O(n2n),预计得分8pts。
36pts做法
尝试设计一个 DPDPDP。
首先先将题意中的挑战定义下形式。
对第 iii 个挑战,(li,ri,vi)(l_i,r_i,v_i)(li,ri,vi) 表示从第 li=xi−yi+1l_i=x_i-y_i+1li=xi−yi+1 天开始,到第 ri=xir_i=x_iri=xi 天为止连续跑步,能够得到的能量值为 viv_ivi。
设 fi,0/1f_{i,0/1}fi,0/1 分别表示第 iii 天强制不选/不强制不选的最大能量。
在附带一个辅助数组 arri,j=∑rk<j,lk=ivkarr_{i,j}=\sum_{r_k<j,l_k=i}v_karri,j=∑rk<j,lk=ivk(具体实现看代码)。
不难发现有转移式
fi,0=maxfi−1,0,fi−1,1f_{i,0} = \max{f_{i-1,0},f_{i-1,1}}fi,0=maxfi−1,0,fi−1,1
fi,1=maxi−j<kfj−1,0+∑k∈[j,i]arrk−(i−j+1)f_{i,1} = \max_{i-j<k}{f_{j -1,0}+\sum_{k\in[j,i]}{arr_k} - (i-j+1)}fi,1=i−j<kmaxfj−1,0+k∈[j,i]∑arrk−(i−j+1)。
当然,根据定义fi,1←maxfi,1,fi,0f_{i,1}\gets \max{f_{i,1},f_{i,0}}fi,1←maxf

最低0.47元/天 解锁文章
1350

被折叠的 条评论
为什么被折叠?



