动态规划_状态压缩dp
TouchDreamer
这个作者很懒,什么都没留下…
展开
-
POJ 3254 Corn Fields(状态压缩dp)
题目分析 状态压缩通常用来处理那些状态很多导致不能容易表达出来,于是需要通过压缩状态进行表示,又利用比如位运算处理一些东西,很容易将结果求出来。我的第一道状态压缩题,注释写的很详细。 #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namesp原创 2016-08-22 09:31:46 · 301 阅读 · 0 评论 -
POJ 1185 炮兵阵地(经典状态压缩dp)
题目分析 与上一道状态压缩题很想,但是动态规划的状态有不同,这道题跟四周的2行有关,不只是一行了,因此对于这种问题如果还是采用上一中的状态,那么因为跟上2行有关,那么我们会发现这样无法写出状态转移方程,因此需要把上面2个状态合并在一起,这样才能正确的写出状态转移方程。dp[i][j][k]表示在第i行状态为k上一行的状态为j的能放的最大炮兵数量。 #include <cstdio> #inclu原创 2016-08-22 15:22:50 · 318 阅读 · 0 评论 -
POJ 3311 Hie with the Pie(状态压缩dp)
题目分析 这道题需要求从0点出发(披萨店)经过其他所有点,并且回到原点的最短距离,因为点数不多最多10个点,很明显是一个TSP问题,并且可以用状态压缩dp进行求解。 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int INF = 0原创 2016-09-01 18:36:57 · 232 阅读 · 0 评论 -
HDU 3001 Travelling(状态压缩dp)
题目分析 每个点最多走2遍,那么显然是3进制进行压缩,0表示没有走过,1表示走过一次,2表示走过2次,dp[i][j]表示状态为i是到达j点所需要的最小费用,运用我为人人的dp思想,找到现在状态能够到达的状态并更新能够到达的状态,知道满足条件的最小值即可。 #include <cmath> #include <cstdio> #include <cstring> #include <iostre原创 2016-09-08 21:24:35 · 216 阅读 · 0 评论 -
POJ 2923 Relocation(状态压缩+背包思想)
题目分析 因为是判断2辆车能够运多少次才能把所有的物品给运完,因为物品数不够多,因此可以枚举状态,判断每个状态能否由2辆车给运完,这里面可以用01背包的思想进行判断,然后自己就可以通过状态压缩写出状态转移方程,很明显dp[(1<<n)−1]dp[(1<<n)-1]就是答案。 #include <cstdio> #include <cstring> #include <iostream> #inc原创 2016-10-31 12:23:31 · 546 阅读 · 0 评论 -
POJ 3071 FootBall 概率dp
题目分析 这道题其实就是全概率公式的应用,可以定义状态为ans[i][j],其表示第j个队在第i轮胜出的概率,这样的话状态转移方程就很好写了。 ans[i][j]=∑ans[i−1][j]∗ans[i−1][k]∗a[j][k];ans[i][j] = \sum ans[i-1][j]*ans[i-1][k]*a[j][k]; 比如8个队,用2进制表示为 000, 001,010,0原创 2017-01-10 16:31:52 · 278 阅读 · 0 评论