Rockers(01变形)
You just inherited the rights to N (1 <= N <= 20) previously unreleased songs recorded by the popular group Raucous Rockers. You plan to release a set of M (1 <= M <= 20) compact disks with a selection of these songs. Each disk can hold a maximum of T (1 <= T <= 20) minutes of music, and a song can not overlap from one disk to another.
Since you are a classical music fan and have no way to judge the artistic merits of these songs, you decide on the following criteria for making the selection:
The songs on the set of disks must appear in the order of the dates that they were written.
The total number of songs included will be maximized.
PROGRAM NAME: rockers
INPUT FORMAT
Line 1:
Three integers: N, T, and M.
Line 2:
N integers that are the lengths of the songs ordered by the date they were written.
SAMPLE INPUT (file rockers.in)
4 5 2
4 3 4 2
OUTPUT FORMAT
A single line with an integer that is the number of songs that will fit on M disks.
SAMPLE OUTPUT (file rockers.out)
3
分析
这里value直接用总数M*T。jump函数如果reminder能用就用当前,不够的话就从前盘开始。一定记得是回退前盘不是前进后盘。因为状态只能<=当前,不行就回退。
# Line 1: Three integers: N, T, and M.
# Line 2: N integers that are the lengths of the songs ordered by the date they were written.
class Rocker:
def jump(self,song,val,T):
if song > val:
return -1
return val-song if val%T >= song else (val//T) * T-song
def maxSong(self,N,T,M,songs):
val = M*T
f=[0]*(val+1)
for i in range(N):
for j in range(val,songs[i]-1,-1):
index = self.jump(songs[i],j,T)
f[j] = max(f[j],f[index]+1 if index>=0 else 0)
return f[val]
Last updated
Was this helpful?