HDU 1074 动态规划,状态压缩

        题目就不再说了,我当初想了很久,怎么去考虑这个全排列,后来想了好久还是放弃了。参考了别人的做法。因为做了很长时间,所以我用自己的语言把这个问题再整理一下。

        我最初的想法是这样的,假设有9个作业嘛。那么做作业的顺序无非是从123456789 ~ 987654321个,也就是N!个,数量十分大,如果要这么做的话,就必须剪枝,剪枝的话总要有个参照物吧?想法是这样,假设得到了某个顺序比如是273514986,得到的总花费是30,那么在接下来的过程中,只要花费已经超过30的,都直接减掉,不需要再搜索。但问题是,我怎么保存这个过程中的花费啊。当时直接就乱掉了。

 

①首先,大家都说是状态压缩,那么未压缩的状态是什么样的,怎么样才算压缩了?

其实上边的困扰也体现出来了。用数字排列的方法得到的是一个过程状态,而不是一个结果状态。比如123456 和 654321代表着两种做完前六中作业的不同方法。但事实上,这两个数字都代表了一个状态,就是前六个作业都做完了,还有一个作业没做。因此如果作业做完了用1表示,未做完用0表示。那么1-9个作业就可以用一个9位的二进制串表示。

那按照前边说的,123456,654321,12347是不是都需要用一个状态表示,数量非常大所以才说压缩了呢?我觉得其实也不是,因为123456和654321是因为没有处理,所以认为是两个东西,或者我们根本就没有想到需要处理。如果经过处理,也可以转化为一种二进制串的形式。

所以我认为,状态没有压缩,只有找到了状态和没有找到状态的说法。

 

②既然是DP问题,那么状态怎么转移的?

从以二进制形式保存的形式来看,一个状态表示的是当前有些作业做完了,还有些作业还没有做。那么怎么从一个状态走向下一个状态呢?那就是在当前没做完的作业中再找一个做。也就是把二进制中为0的位找一位置为1,然后开始运算。

 

至于具体的代码,就不贴了。掌握了思想,还是自己写出来比较好。

说的不是太清楚,因为我自己理解也不是太深。希望有大神能把状态压缩讲的更易懂一些,对我们这群菜鸟来说,也是个福利吧

 

你可能感兴趣的:(HDU 1074 动态规划,状态压缩)