随笔分类 -  { 动态规划 }

摘要:题意:有n个国家,贿赂它们都需要一定的代价,一个国家被贿赂了从属这个国家的国家也相当于被贿赂了,问贿赂至少k个国家的最少代价。 这些国家的从属关系形成一个森林,加个超级根连接,就是一棵树了,考虑用DP: dp[u][m]表示以u国家为根的子树贿赂m个国家的最少代价 单单这样的话转移是指数级的,其实这 阅读全文
posted @ 2016-02-28 15:22 WABoss 阅读(260) 评论(0) 推荐(0) 编辑
摘要:给一张有向无环图,边都有花费,从某点到某点走的那条路径上的那一条花费最多的边可以省掉,问从起点到终点的最少花费的多少, 往DP想的话,就可以写出这个状态dp[u][mx],表示到达u点已经省掉的花费为mx的最少花费。 用SPFA更新转移方程。。或者理解成队列+我为人人的转移。。其实这题这样子也能解有 阅读全文
posted @ 2016-02-27 17:00 WABoss 阅读(236) 评论(0) 推荐(0) 编辑
摘要:给一个括号序列,求有几个括号是匹配的。 dp[i][j]表示序列[i,j]的匹配数 dp[i][j]=dp[i+1][j-1]+2(括号i和括号j匹配) dp[i][j]=max(dp[i][k]+dp[k+1][j])(i<=k<j) 1 #include<cstdio> 2 #include<c 阅读全文
posted @ 2016-02-24 21:14 WABoss 阅读(203) 评论(0) 推荐(0) 编辑
摘要:题目给个n×m的地图,1可以放玉米0不可以,现在要放玉米,玉米上下左右不能相邻,问放法有几种。 当前一行的决策只会影响下一行,所以状压DP之: dp[i][S]表示前i行放完且第i行放玉米的列的集合是S的方案数 先预处理出每一行合法的放法的集合,合法的放法其实是很少的,通过枚举合法的集合来转移。 1 阅读全文
posted @ 2016-02-17 15:42 WABoss 阅读(141) 评论(0) 推荐(0) 编辑
摘要:题目是平面上n个点,要用若干个矩形盖住它们,每个矩形上至少要包含2个点,问要用的矩形的面积和最少是多少。 容易反证得出每个矩形上四个角必定至少覆盖了两个点。然后就状压DP: dp[S]表示覆盖的点集为S要用的最少矩形面积 转移我一开始是未覆盖的点和已覆盖的点构成一个矩形来转移,这是错的,因为这样子的 阅读全文
posted @ 2016-02-16 12:03 WABoss 阅读(425) 评论(0) 推荐(1) 编辑
摘要:题目给几个字符串,可以给它们添加前导空格,然后排列,计算每一个字符串和前一个字符串相同非空格字符相等的个数,求可能的最大个数。 状态DP: d[S][i][j]表示已经用的字符串集合S且排列的最后一个是前面带j个空格的字符串i 转移就枚举从什么字符串几个前导0结尾转移过来的。还可以预处理一下各个情况 阅读全文
posted @ 2016-02-15 17:36 WABoss 阅读(256) 评论(0) 推荐(0) 编辑
摘要:题目是,有n头牛,每头牛都喜爱某几个草地,要把这n头牛分配给m个不同的它们喜爱的草地,问有几种分配方式。 dp[n][S]表示前n头牛分配完毕后占用的草地集合是S的方案数 dp[0][0]=1 dp[n][S]+=dp[n-1][S-x](x∈S且n喜爱x) 不过的状态这样空间开销太大了,事实上n这 阅读全文
posted @ 2016-02-14 09:20 WABoss 阅读(251) 评论(0) 推荐(0) 编辑
摘要:题目给一张n×n的格子,每个格子都有数字,要从格子中取若干个数字,八个方向相邻的数字不能一起取,问取的数字最大和是多少。 从第一行一行一行看下去,可以发现第1行取哪几列只会影响到第2行,第3行后面的一点影响都没有。即第i行的决策只受i-1行决策的影响。 那么自然想到状态DP—— dp[i][S]前i 阅读全文
posted @ 2016-02-13 22:57 WABoss 阅读(248) 评论(0) 推荐(0) 编辑
摘要:题目是有n个存有宝藏的城堡,攻克任何一个城堡都需要先攻克0个或其他1个城堡,问攻克m个城堡最多能得到多少宝藏。 题目给的城堡形成一个森林,添加一个超级根把森林连在一起就是树了,那么就考虑用树型DP: dp[u][m]表示以u结点为根的子树攻克m个结点的最大价值 但是这样转移太难了,根是从每个孩子通过 阅读全文
posted @ 2016-02-12 19:15 WABoss 阅读(953) 评论(1) 推荐(3) 编辑
摘要:题目求一棵树的最小支配数。 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻。 听说即使是二分图,最小支配集的求解也是还没多项式算法的。而树上求最小支配集树型DP就OK了。 树上的每个结点作为其子树的根可以有三个状态: 不属于支配集且还没被支配 不属于支配集但被其孩子支配 阅读全文
posted @ 2016-02-11 18:30 WABoss 阅读(298) 评论(1) 推荐(1) 编辑
摘要:给两个长n的01串s1和s2,要对s1进行k次修改,每次修改m个不同位置,问有几种方式修改成s2。 想偏了,只想到原始的01数值是不重要的,因为每个位置修改次数的奇偶性是确定的这一层。。 其实,这题只要关心从起点到终点有几个位置是不同的,一个数值足矣。 然后具体的状态就是:dp[i][j]表示,进行 阅读全文
posted @ 2016-02-09 22:18 WABoss 阅读(265) 评论(0) 推荐(0) 编辑
摘要:题目大概是抢劫银行,每家银行都有一个收益和一个被抓的概率,求在被抓概率小于P的条件下能获得的最大收益。 dp[i][j]表示抢劫前i家银行收益为j被抓的最小概率 dp[0][0]=0 dp[i][j]=min(dp[i-1][j],dp[i-1][j-m[i]]+(1-dp[i-1][j-m[i]] 阅读全文
posted @ 2016-02-01 22:51 WABoss 阅读(231) 评论(0) 推荐(0) 编辑
摘要:题目问一个数字字符串的不重复全排列有几个能被d整除。 dp[S][m]表示用字符集合S构成的%d为m的数字字符串个数 dp[0][0]=0 我为人人转移,dp[S+{x}][(m*10+str[x]-'0')%d]+=dp[S][m](x∉S) 最后的结果再除以各字符出现次数的阶乘就是答案了,即dp 阅读全文
posted @ 2016-02-01 22:45 WABoss 阅读(207) 评论(0) 推荐(0) 编辑
摘要:题目是在n*n的棋盘上放k个车使其不互相攻击的方案数。 首先可以明确的是n*n最多只能合法地放n个车,即每一行都指派一个列去放车。 dp[i][j]表示棋盘前i行总共放了j个车的方案数 dp[0][0]=1 转移就是从第i-1行转移到第i行,对于第i行要嘛放上一个车要嘛不放,放的话有n-j-1种方法 阅读全文
posted @ 2016-02-01 20:43 WABoss 阅读(232) 评论(0) 推荐(0) 编辑
摘要:题目问长度m不包含一些不文明单词的字符串有多少个。 依然是水水的AC自动机+DP。。做完后发现居然和POJ2778是一道题,回过头来看都水水的。。。 dp[i][j]表示长度i(在自动机转移i步)且后缀状态为自动机第j个结点的合法字符串数 dp[0][0]=1 转移转移。。。 注意要用高精度,因为答 阅读全文
posted @ 2016-01-31 21:19 WABoss 阅读(318) 评论(0) 推荐(0) 编辑
摘要:题目是给一个DNA重新排列使其包含最多的数论基因。 考虑到内存大概就只能这么表示状态: dp[i][A][C][G][T],表示包含各碱基个数为ACGT且当前后缀状态为自动机第i的结点的字符串最多的数论基因数 其中ACGT可以hash成一个整数(a*C*G*T+c*G*T+g*T+T),这样用二维数 阅读全文
posted @ 2016-01-31 18:59 WABoss 阅读(257) 评论(0) 推荐(0) 编辑
摘要:题目是给几个带有价值的单词。而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题。。不一样的是这题要输出具体方案,加个字符数组记录每个状态最优情况的字符串即可。 另外题目字典序是先考虑长度再考虑每一位单词;特别要注意, 阅读全文
posted @ 2016-01-30 23:13 WABoss 阅读(213) 评论(0) 推荐(0) 编辑
摘要:题目大概是给几个DNA片段以及它们各自的权值,如果一个DNA包含某个片段那么它的价值就加上这个片段的权值,同时包含多个相同DNA片段也只加一次,问长度l的DNA可能的最大价值。 与HDU2825大同小异。 dp[i][j][S]表示长度i(自动机转移i步)、后缀状态为自动机第j个结点、包含的DNA片 阅读全文
posted @ 2016-01-30 19:22 WABoss 阅读(216) 评论(0) 推荐(0) 编辑
摘要:题目问长度n至少包含k个咒语的字符串有多少个。也是比较入门的题。。 dp[i][j][S]表示长度i(在自动机上转移k步)且后缀状态为自动机上第j个结点且当前包含咒语集合为S的方案数 dp[0][0][0]=1 还是用我为人人转移,AC自动机上的结点要多一个域表示这个结点所代表咒语前缀包含的咒语集合 阅读全文
posted @ 2016-01-30 11:15 WABoss 阅读(748) 评论(0) 推荐(0) 编辑
摘要:题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段。 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来。 dp[i][j]表示原DNA前i位(在AC自动机上转移i步)且后缀状态为AC自动机结点j的最少需要修改的基因数 转移我为人人型,从dp[i][j]向ATCG四个 阅读全文
posted @ 2016-01-29 20:06 WABoss 阅读(322) 评论(0) 推荐(1) 编辑