HDU - 3237 Help Bubu (好题)

2014-11-24 07:22:12 · 作者: · 浏览: 0

题意:书架上有n本书,连续的相同高度的归为一类,现在你最多可以拿走m本书然后可以放在任何位置,求最少的类

思路:看了别人的觉得学到了很多,首先dp[i][j][k][s]表示前i本书拿走j本剩下的书的状态是k最后一本书的高度是s的最少类数,其实当我们在不超过m次的拿书的过程中,如果能让类数达到最少的话,且拿走的书也固定了类数,那么就能求出最小了,觉得第4维的设定很精彩啊,一下子就为状态转移方程提供了思路,每次的书我们有拿与不拿的选择,那么当不拿走的时候如果这本书与目前的最后一本不一样的话就+1,否则不用,同时不断的滚动数组求出最小值,显然后三维就可以解释状态了,缺的是当前和上一步,又加了一维,

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       using namespace std; const int MAXN = 110; const int INF = 0x3f3f3f3f; int n,m,ht[MAXN],ans,one[1<<8]; int state,dp[2][MAXN][1<<8][10]; void init(){ for (int i = 0; i < (1<<8); i++){ for (int j = 0; j < 8; j++) if (i & (1<
      
        mx) mx = ht[i]; state |= (1<