NKPC7-2155-Crazy Review

1. 概述

    题目出的很有意思,在有限的时间内,合理分配时间,得到最大的分数。标注答案是动态规划。感觉和编程之美上,一个求最大连续子数组之和的题目很像,因为两道题都涉及到了两个动态规划,而且其中的一个动态规划使用另一个动态规划。

2. 方法

    首先,判断所有课程上限是否到60分,
    然后,对于没有到60分的课程分别先学习到60分,并且更新S,V和H。
    接着,计算使用剩下的H,即时间,能够得到的最高分数。
    这里主要说一下最后一步动态规划的过程。
    SingleCourse[i][j] 表示在i号课程上,学习j小时后,能够取得的分数。
    MultiCourse[i][j] 表示在从0号课程到i号课程上,一共学习j小时候,能够取得的最大分数。
3. SingleCourse的计算

    S[i] = Min{ S[i]+V[i], U[i] } // 分数不能超过上限
    V[i] = max{ 0, V[i]+DV[i] } // 分数顶多不会增加,但是绝对不会因为复习过多而下降
    SingleCourse[i][j] = S[i]

    复杂度:    SingelCourse[20][500], T<=20*500=10000
4. MultiCourse的计算

    MultiCourse[0][j] = SingleCourse[0][j]
    对于i>0有:
    MultiCourse[i][j] = max { (SingleCourse[i][k]+MultiCourse[i-1][j-k]) } , 其中k从0到j
    复杂度: MultiCourse[20][50], T<=20*50*50=100000

5. 复杂度

    总的复杂度在10^5以内,没问题。

6. 题目网址

    http://acm.nankai.edu.cn/p2155.html

 

posted @ 2011-05-04 14:50  xiaodongrush  阅读(286)  评论(0编辑  收藏  举报