DP|状压DP
MaJorie555
我们向右偏左的坠落,琢磨着寻求自我
展开
-
HDU5961 Sitting in Line【状压DP】
题目链接:HDU5961 Sitting in Line题意:给你n个数和他们的位置,如果位置为-1表示这个数可以取任意位置,选择一种放置方式,使得相邻两数乘积之和最大;分析:N<=16,考虑状压DP;dp[i][j]表示取状态i中为1的数放在前面且这一位放j时的答案;当dp[i][j]成立时,可以从它向后更新dp[i|(1<<k)][k],要注意更新时需要判断这一位的位...原创 2019-10-31 11:22:17 · 113 阅读 · 0 评论 -
CF1238 E.Keyboard Purchase【状压/子集划分DP】
题目链接:CF1238 E.Keyboard Purchase题意:给你一个由前m个字母组成的长度为n(1e5)的字符串,要求你决定一个前m(20)个字母的排列,每个字母的价值是它在排列中的位置,原字符串的代价是相邻两个字母的价值差,问字符串的最小代价是多少;分析:首先可以预处理出相邻字母组合的出现次数;考虑状态压缩,第i位为1表示第i个字母已经定过了排列的位置,为0表示他的位置没有决定,...原创 2019-10-14 21:30:28 · 196 阅读 · 0 评论 -
Petrozavodsk Winter-2018. Jagiellonian U Contest E.Guessing Game【三进制状压DP】
题意:和UVA1252一样,n个长为k的01串,问最优策略下最多猜几次就可以知道是哪个串;分析:UVA那个题k是11,刚好可以暴搜,但是这个题是13,就要想想状压DP,但这个每一位有三种状态,已定为1,已定为2,未定,所以就是三进制下的状压DP,就可以先预处理出所有状态三进制下每一位的值和3^i(p[i]);读入过程中处理记下出现的状态,记下个数为1,然后扫所有状态,比如状态i的第j位是2,表...原创 2019-10-11 18:19:43 · 195 阅读 · 0 评论 -
HDU3001 Travelling【三进制状压DP】
题目链接:HDU3001 Travelling题意:n个点m条边的无向图,问每个点至少访问一次至多访问两次的最小花费是多少;分析:三进制状压DP,每一个点有访问0、1、2次三种状态,那么就一共有3^(n-1)-1种状态;因为不是二进制,不能进行位运算,所以要提前预处理出所有状态三进制下每一位的值,然后就是枚举所有状态的每一位,向其他状态进行转移;#include<bits/st...原创 2019-10-11 17:15:31 · 158 阅读 · 0 评论 -
HDU3182 Hamburger Magi【状压DP】
题目链接:Hamburger Magi分析:每种汉堡只能做一次,恰好就是0~(1<<n)-1的所有状态;#include<bits/stdc++.h>#define pb push_backusing namespace std;typedef long long ll;const int maxn=(1<<15)+100;int dp[ma...原创 2019-10-04 14:20:18 · 122 阅读 · 0 评论 -
洛谷P2704 炮兵阵地【状压DP】
题目链接:P2704 炮兵阵地题意:炮兵的攻击范围时是十字形,H上不能放炮兵,炮兵的攻击范围内不能放炮兵,问地图上最多放几个炮兵;分析:能否放置炮兵首先要满足当前行的状态,其次因为攻击范围是十字形,所以与该状态左移一位或左移两位是否有冲突有关,还与上一行和上上一行的状态有关,所以就要在朴素的状压DP上再加一维记录上一行的状态,这样由上一行更新的时候就可以知道上上一行的状态。#incl...原创 2019-10-04 12:20:01 · 166 阅读 · 0 评论 -
UVA1252 20个问题【状压DP+DFS】
题目链接:UVA1252题意:给你n个物品,每个物品有m种属性,1代表有,0代表没有,问至少几次询问可以知道我心中想的是哪个;分析:不知道是哪个串,所以可以是任意一个,那么就是所有串的最少询问次数里最大的那个;01串,考虑状压成一个数;思考一下,猜物品的过程中一定是一位一位猜,然后根据满足或不满足筛掉或选择一些物品,然后继续判断下一位的两种情况,所以必然是一个DFS的递归迭代过程;那么也就...原创 2019-10-03 21:29:52 · 168 阅读 · 0 评论 -
洛谷P1896 互不侵犯【状压DP】
题目链接:P1896 互不侵犯分析:普通的状压DP再多加一维记个数,然后找到能转移到当前的状态更新答案;#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=(1<<10)+7;ll dp[15][maxn][110];int num[maxn];b...原创 2019-10-02 21:28:30 · 153 阅读 · 0 评论 -
洛谷P1879 玉米田Corn Fields【状压DP】
处理出第一行的所有可行清空,第二行到第n行的所有可行状态由上一行的可行状态转移而来,dp[i][j]表示第i行在第j个状态时的方案数;将初始map提前状压,运用位运算判断可行性,这些都很好用;#include<bits/stdc++.h>using namespace std;const int maxn=1<<15;const int mod=100000...原创 2019-10-01 16:59:25 · 101 阅读 · 0 评论 -
洛谷P2622 关灯问题II【状压bfs】
分析:对状态进行bfs转移,剪枝掉出现过的状态;#include<bits/stdc++.h>using namespace std;int n,m;int a[110][20];map<int,int> vis;struct node{int cd,num;};queue<node> Q;int bfs(){ node cur={...原创 2019-10-01 14:06:35 · 132 阅读 · 0 评论 -
洛谷P3052 摩天大楼里的奶牛Cows in a Skyscraper【状压DP】
1<<n-1种状态下枚举n个奶牛并转移状态;dp[i] 状态i时最小数量;res[i] 状态i时剩余的体积;#include<bits/stdc++.h>#define pb push_backusing namespace std;typedef long long ll;const int maxn=1<<18;const int m...原创 2019-09-30 18:28:50 · 217 阅读 · 0 评论 -
2016-2017 CCPC Finals H.Engineer Assignment【状压DP】
题意:n个工程,每个工程需要至多三种技术,m个工人,每个工人拥有技术,当工程招聘的工人覆盖所有需要的技术时工程可以实现,允许一个工人覆盖一个工程的多种技术,问至多有多少个工程可以实现。分析:只要最终答案而不要求分配方案,考虑dp;n和m的范围只有10,那么对于每个工程而言只有(1<<m)-1个状态,考虑状压dp;暴力枚举每个工程的所有状态,check得到所有可行的状态...原创 2019-09-29 10:38:03 · 147 阅读 · 0 评论 -
HDU6664 Andy and Maze 【color coding/状压dp】
题目链接:Andy and Maze题意:n个房间,每个房间里有一块宝石,m条无向边连接,经过每条路径都有花费,到达每个房间可以获得一块宝石,获得k块就可以逃离迷宫,但是这条获得宝石的路径上同一个房间不能进入多次,你不知道哪里是起点,问满足条件的路径最多花费多少;分析:color coding算法(一种随机算法),大概思路是给n个节点分别染色,使得一条路径上两两不同,更新答案,于是就可...原创 2019-09-13 12:56:13 · 224 阅读 · 0 评论