Description
Bubu的书架乱成一团了!帮他一下吧!
他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如,如果书的高度是30,30,31,31,32,那么混乱值为3,30,32,32,31的混乱度也是3,但31,32,31,32,31的混乱度是5-这实在是太乱了。
Bubu想尽可能的减少混乱度,但他有点累了,所以他决定最多取出k本书,再随意将他们放到书架上。你能帮助他吗?
Input
最多会有20组测试数据。每组测试数据开头为两个整数n,k(1<=k<=n<=100),表示总共有n本书,最多可以进行k次搬书操作。接下来一行有n个整数,表示每本书的高度,从左到右。每本书的高度是25到32间的整数。最后一组数据后有一行n=k=0。
Output
对于每一组数据,输出Case标号和最终最小的混乱度。在每组数据后打印一个空行。
Sample Input
5 2
25 25 32 32 25
5 1
25 26 25 26 25
0 0
Sample Output
Case 1: 2
Case 2: 3
想法:
a[i]范围小,每个先减24
设f[i][j][k][l]为前i本书,抽走了j本书,前i本没有抽走的书状态为j,最后一本没有抽走的书高度为k
若抽掉第i+1本:f[i+1,j+1,k,l]=min(f[i,j,k,l])
若不抽:f[i+1,j,k or 2^a[i+1],a[i+1]]=min(f[i,j,k,l]+p) 若a[i+1]!=l,那么p=1否则=0
设sum表示原数组中出现过的高度的状态
设b[i]表示i在二进制下1的个数(可预处理)
答案=min(f[n,i,j,k]+b[sum-j]) (为什么+b?因为之前抽了一些书,要放回去,如果大书架没有这个高度,那么答案+1,否则就插到相同高度那里)