链接
\(\text{hihoCoder - 1044 状态压缩一}\)
题意
火车上有\(n\)个座位排成一排,第\(i\)个座位上有数目\(w[i]\)的垃圾,你需要尽可能多的清扫这些垃圾,然而在连续\(m\)个座位上,你最多只能选取\(q\)个位置进行清扫,不然会让乘客不愉快,现在问你最多可以清扫多少数目的垃圾;
输入格式:输入包含一组样例,第一行三个数\(n,m,q\),第二行\(n\)个整数,第\(i\)个为\(w[i]\);
数据范围:\(N\leq 1000,2\leq M\leq 10,1\leq q\leq m,w[i]\leq 100\).
输出格式:输出一行代表最多可以清扫的垃圾数目;
分析
如果我们考虑每个位置的选与不选,那么最多可能有\(2^1000\)种状态,显然这种想法不现实,我们发现,如果当前位置\(i\)的前\(m-1\)个位置中已经选了\(q\)个了(即在\([i-m+1,i-1]\)中选\(q\)个),这种状态为\(j\),那么显然当前位置一定不能选,所以当前位置的最大值等于,在第\(i-1\)个位置,\([i-m+1,i-1]\)中选了\(q\)个,而第\(i-m\)这个位置一定不选(对于\(i-1\)来说,需要在\([i-m,i-1]\)中选\(q\)个),这时候的最大值,同理当第\(i\)个位置选的时候,考虑它的状态可以从\(i-1\)的什么状态转移过来即可。
第\(i\)个座位为阶段,\(i\)之前包括\(i\)个\(m\)个选若干个为状态。
首先预处理一下,\(m\)个连续座位里选小于\(q\)个座位的状态,具体细节见代码。
代码
1 |
|