码迷,mamicode.com
首页 > 其他好文 > 详细

滑雪(dp好题)

时间:2014-09-17 20:09:32      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:style   color   os   ar   strong   数据   sp   on   c   

题目描述:贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣。贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开。滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 Di 分钟,要求游客的能力达到 Ci 或以上时才能进入。贝西决心参加一些滑雪课程以提高自己的素质,这样可以在有限的时间内多滑几次坡。

滑雪场提供了 S 门课程。第 i 门课的开始时刻为 Mi,持续 Li 分钟,如果想参加课程,就不能迟到或早退。上完课之后,贝西的滑雪能力将变成 Ai。注意,不是能力增加 Ai,而是变成 Ai,所以乱上课的话反而会使能力下降。贝西可以随意安排她的时间:滑雪、上课,或美美地喝上一杯可可汁。请问她如何安排上课和滑雪的时间,滑坡的次数才能达到最大?(懒得概括了。。)

同一个坡可以滑无数次。

 

输入格式

 

• 第一行:三个整数 T ,S 和 N ,1 ≤ T ≤ 10^4 , 1 ≤ S ≤ 100, 1 ≤ N ≤ 10^5

 

• 第二行到 S + 1 行:第 i + 1 行描述了第 i 门课程,分别为 Mi,Li 和 Ai,1 ≤ Mi , Li ≤ 10^4

 

, 1 ≤Ai ≤ 100

 

• 第 S + 2 行到 S + N + 1 行:第 S + i + 1 行描述了第 i 条斜坡,分别为 Ci 和 Di,1 ≤ Ci≤100, 1 ≤ Di ≤ 10^4

 

输出格式

 

• 单个整数,表示贝西可以滑完的最大次数

 

解题过程:

1.一开始被那么多的数据吓住了。。完全找不到头绪,然后就开始看数据范围来瞎凑。状态至少是二维的,当前的能力值肯定是要算在状态里的(因为最大只有100),然后N肯定不会拿来当状态(否则10^5 * 100=10^7,转移必须是O(1)才不会超时,而O(1)的转移肯定是做不到的。)。那么只能是用时间T来当状态。。F[i][j]表示时间为i且能力值为j的时候最多已经滑了多少次。。然后看了下样例解释,竟然同一个坡可以滑无数次。题目里竟然没说,还好没思路去看了下样例。。

以后做题还是要认真看完样例解释,充分理解题意。。

2.既然同一个坡可以滑很多次,那么机智的我们肯定会选择当前能滑的且时间花费最少的 去滑。所以用t[i]处理出需要能力值为i的山坡的最小花费。然后扫一遍求出can[i],即当前能力值为i的时候能滑的山坡的最小花费。can[i]=min(can[i-1],t[i]);

3.对于状态F[i][j],首先可以继承F[i-1][j]的值,然后可以由F[i-can[j]][j]+1转移过来(滑一次花费最小的山坡)。

那么如果学习了一门课呢?显然如果要学习一门课,课程的结束时间必须小于等于i,那么其实只考虑课程的结束时间等于i就行,因为F[i][j]会继承F[k][j]的值(k<i)。那么先预先处理处course[i][j] ,表示结束时间为i,学习后能力值为j的课程所要花费的最少时间,如果不存在则为无穷大。那么有:

F[i][j]=max(F[i-1][j]  ,  F[i-can[j]][j]+1  ,   max(F[i-course[i][j]][k])  ) ,k<j.

 

而对于 max(F[i-course[i][j]][k])  可以用s[i][j]保存下来,那么方程变为

F[i][j]=max(F[i-1][j]  ,  F[i-can[j]][j]+1  ,   s[i-course[i][j]][j-1]) ;   在求F[i][j]的时候s[i-course[i][j]][j-1] 已经求出来了。

滑雪(dp好题)

标签:style   color   os   ar   strong   数据   sp   on   c   

原文地址:http://www.cnblogs.com/vb4896/p/3977836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!