
————动态规划————
文章平均质量分 74
01的世界
有时,失去了才懂得珍惜
展开
-
hdu 3555 含有49的数 数位dp
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3555题意:给定任意n,计算从1~n中有多少数包含49分析:今天看到群里有个人问这道题,我就做了一下,dfs就搞定了。。看了一下题解,大部分是递推,找规律求解。但是做题还是dfs#include#includeusing namespace std;typedef lo原创 2016-03-13 17:22:33 · 417 阅读 · 0 评论 -
poj 1155 树形dp+分组背包
题目:点击打开链接题意:有一个电视台要用电视网络转播节目。这种电视网络是一树,树的节点为中转站或者用户。树节点的编号为1~N,其中1为总站,2~(N-M)为中转站,(总站和中转站统称为转发站)N-M+1~N为用户,电视节目从一个地方传到另一个地方都要费用,同时每一个用户愿意出相应的钱来付电视节目。现在的问题是,在电视台不亏本的前提下,要你求最多允许有多少个用户可以看到电视节目。输入:原创 2016-02-17 22:33:19 · 304 阅读 · 0 评论 -
zoj 3626 树形dp
题目:点击打开链接题意:有n个城镇,他们之间有路相通,知道每条路需要走的天数,每个城镇的价值,现在一个人想要从k点出发,在m天内去访问别的城镇,但是必须在m天之前返回k点,求可以获得的最大价值dp[i][j]表示从i点出发走j天获得的最大价值,需要往返,注意m/=2即可状态转移方程dp[u][j]=max(dp[u][j],dp[u][j-k-w[u][v]]+dp[v][原创 2016-02-17 18:47:55 · 285 阅读 · 0 评论 -
hdu 1712 裸分组背包
题意:有n门课程,有个人有m天时间去学习,每门课程学习不同的天数会有不同的价值,问最大价值?分析:这是一道十分裸的分组背包题。以下是背包九讲的文段,我刚开始做用的是二维,其实一维就够了。这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选 。 也就是说设 f[k][v]表示前 k 组物品花费费用 v 能取得的最大权值,则有:f[k][v]=max{f[k-1]原创 2016-02-16 15:30:48 · 359 阅读 · 0 评论 -
UVA 1218 完美服务 树形dp
题意:有n台计算机形成树形结构,要求在其中一些做服务器,使得每台不是服务器的计算机恰好和一台服务器相连,求服务器的最少数量。分析:不看题解的话,不会做。。。f[u][0]:表示u是服务器,则每个子节点可以是服务器也可以不是服务器 状态转移方程是:f[u][0]=sum{ min(f[v][0],f[v][1]) }+1;f[u][1]:表示u不是服务器,但u的父亲是服务器,那原创 2016-02-15 12:42:03 · 292 阅读 · 0 评论 -
poj 1655 求树的重心
题目:点击打开链接题意:有n-1条边链接n个点形成树形结构,问删除哪个点使得,形成的最大连通分量节点数最少,如有多解,输出字典序最小的分析:和poj3107那题一样,求树的重心,dfs一次,从叶子到根转移,求出每个点的子树的最大连通分量,再和父节点所在一侧的连通分量比较,取最大的一个,再看是否比其他点形成的连通分量节点数大,就这样,把重心点放到一个数组中,排序后,取第一个。#inc原创 2016-02-15 09:05:50 · 435 阅读 · 0 评论 -
poj 2378 简单树形dp
题目:http://poj.org/problem?id=2378题意:有n个谷仓有n-1条路连接,问最少删除哪几个点才能使得删除点后得到的连通图的加点数不大于n/2.分析:求树的重心的变形题,poj3107的简单版,一遍dfs从叶子到根转移找出找到以每个节点为根的子树的结点数,f[u]={ f[v1]+f[v2]+.....+f[vn] }+1;使得每棵子树节点数小于n/2,并且父节点得原创 2016-02-14 19:06:04 · 487 阅读 · 0 评论 -
poj 3107 Godfather 求树的重心
题目:点击打开链接题意:黑手党有n个人,关系相当于一棵n个节点的树,去掉某个节点后,树被分成很多块,使得分出来的块中最大连通块节点数最小,这个节点便是Goldfather,Goldfather可能有多个,升序输出。分析:其实这是一道求树的重心的问题,对于一颗n结点的无根树,找到一个点,使得把树变成以该节点为根的有根数时,最大子树的节点数最小。也就是说,删除这个点后最大连通块的节点数最小原创 2016-02-14 15:50:50 · 397 阅读 · 0 评论 -
hdu 1520 树形dp
题目:点击打开链接题意:每个节点有权值,子节点和父节点不能同时选,问最后能选的最大价值是多少?分析:这题一看到首先想到的是贪心,就是选间隔的层次的点,可是仔细想想这样是不对的,假如说选了第一层,那么肯定不能选第二层,那么这时候选第三层一定是最优的吗?显然不对,有可能不选第三层而选第四层,所以思路逐渐地清晰。用f[i][0]表示没选这个点,f[i][1]表示选了这个点,那么状态战役方程就很明原创 2016-02-13 12:23:14 · 323 阅读 · 0 评论 -
Hdu 2196 Computer 经典树形dp
题目链接:点击打开链接题意:给一棵树,每条树边都有权值,问从每个顶点出发,经过的路径权值之和最大为多少?n 分析:我的第一道树形dp题,看了几篇博客,一般的树形dp题,差不多就是一遍或两遍dfs,维护从根到叶子或从叶子到根的状态转移。这题就是典型的树形dp题。第一遍dfs从叶子到根,统计出以每个点为根的子树的最长距离和次长距离,然后第二次dfs从根到叶子,求出每个点通过父节点得到的最长原创 2016-02-13 10:39:38 · 311 阅读 · 0 评论 -
Codeforces 533B 树上的dp(求最大偶数个节点的权重和)
题目:点击打开链接题意:给你n个节点,每个节点已知父亲和权值,1节点为根必选,你从中挑选节点,以每个节点为父亲的子节点个数和必须为偶数,问最大的权值和分析:从叶子结点,更新他的父节点,直到跟新到树根。f[i][0]表示以i节点为树根的节点数为偶数个的最大权值和f[i][0]表示以i节点为树根的节点数为奇数个的最大权值和状态转移方程就是,如果是奇数个再加上一个节点原创 2016-03-01 20:40:26 · 1120 阅读 · 0 评论 -
Codeforces 628D 偶数位全是某个数 数位dp
题目:点击打开链接题意:d magic number(0题目问,给a,b,m,d(a分析:一道简单的数位dp题,也没什么好说的。就是bit下标是从0开始的,奇偶换一下就可以了。#include#include#include#include#includeusing namespace std;typedef long long ll;const int原创 2016-03-01 18:11:21 · 369 阅读 · 0 评论 -
hdu 5623 KK's Number dp 博弈
题意:我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N(1≤N≤5∗104)N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗104)个数,每次KK都会先拿数。每次可以拿任意多个数,直到NNN个数被拿完。每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大。在这样的情况下,最终KK的得分减原创 2016-02-09 17:14:39 · 364 阅读 · 0 评论 -
UVa 11548 例题9-7划分回文串
题意:输入一个由小写字母组成的字符串,把它划分成尽量少的回文串分析:d[i]为0-i划分的最小回文串的个数则d[i]=min{d[j]+1 | s[j+1~i]是回文串}。判断s[j+1~i]是否是回文串,也是O(n)的时间复杂度,可以记忆化搜索,判断过的标记一下,就不会重判了。但这题数据好像有点水,记忆化后反而变慢了。#include#include#include#inclu原创 2015-12-09 09:55:35 · 472 阅读 · 0 评论 -
nyoj 最长公共子序列
最长公共子序列时间限制:3000 ms | 内存限制:65535 KB难度:3描述咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中原创 2015-12-09 08:52:44 · 250 阅读 · 0 评论 -
对《浅谈数位类统计问题》的学习
学习了一下数位这类问题,看了这篇论文,不错,把代码敲了一下,没有注册账号验证一下,仅供参考。论文:点击打开链接【例题 1】Amount of degrees (ural 1057) 题目大意: 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K 个互不相等的 B 的整 数次幂之和。例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 17 = 2原创 2016-02-19 14:18:40 · 587 阅读 · 0 评论 -
按位求和问题 数位计数
看了高逸涵 写的那篇《数位计数问题解法研究》,照着他给的代码,学习一下。例一、按位求和问题1 题目大意: 给定 A,B(1代码:#include#includeusing namespace std;typedef long long ll;ll getsum1(int n,int k) //此函数是求n位之内的k进制的数位之和。{ ll B=1;原创 2016-02-19 17:26:32 · 2778 阅读 · 0 评论 -
BC #75 hdu 5642 数位dp/ 递推
这次的BC题目不难,01最大公约数,02模拟,只是没看清数据范围坑了几次,03dp,04如果做过约瑟夫问题的,那就是一道大水题题目:http://acm.hdu.edu.cn/showproblem.php?pid=5642题意:数一个长度为 nnn 的序列 , 并且序列中不能出现长度大于 333 的连续的相同的字符 , 这玩意就是一个数位DP嘛。 定义 d[i][原创 2016-03-13 17:22:09 · 496 阅读 · 2 评论 -
hdu1693 Eat the Trees 插头DP
题目:点击打开链接题意:一个棋盘上有0,1.需要找一些回路把1全部串起来,问总方法数分析:插头dp第一题,果然有点难度,用了我一天的时间,还是自己太菜了。。。。我是看了这个图才恍然大悟的,这就对应下面的三种可以联通的情况。对于为什么 f[i][0][s可参考文档:http://www.docin.com/p-741918386.html图片来原创 2016-02-27 22:06:35 · 356 阅读 · 0 评论 -
poj 2411 骨牌覆盖问题 状压dp
题目:点击打开链接题意:用1*2 的矩形通过组合拼成大矩形,求拼成指定的大矩形有几种拼法分析:这题的关键在于什么状态是合法的,可以这样想,用1表示有骨牌覆盖,用0表示空着。在覆盖第i行的时候,那么如果覆盖的状态是合法的,覆盖完后第i-1行必须没有空格了(全是1111),所以可以看出,每一行的状态必须要有偶数个1相连,为什么?由于在做第i行dp时必须完全覆盖第i-1行,只原创 2016-02-27 00:04:25 · 1895 阅读 · 0 评论 -
zoj 3471 Most Powerful 状压dp(简单)
题目:点击打开链接题意:有n种原子,原子i和j相撞,如果j消失,会产生能量a[i][j],如果i消失,会产生a[j][i]能量,问产生的最大能量。分析:这题很简单,本没必要写,但这是我第一道独立做出来的状压dp题,于是写出来了。f[i]表示状态是i的最大能量,i是一个二进制数,1表示原子还存,0表示已经消失了,所以状态转移就明显了f[s]=min{ f[s-{j} ] }.原创 2016-02-26 20:09:04 · 327 阅读 · 0 评论 -
Codeforces 623A 623B dp
题目:623AGraph and String题意:题目要求a,b,c,三个字母,如果相邻或者相等就连一条边,现在给你边,问是否存在这样的数组。分析:可以反着考虑,可见,如果没边,那么一定是a和c相邻,b无论跟谁相邻都会有边,所以O(n^2)遍历找到没边的两点,分别给这两点填上a或者c,这是如果a,c已经填上了同一种颜色,那么肯定原创 2016-03-11 16:54:41 · 704 阅读 · 0 评论 -
hdu 3001 Travelling 状压dp TSP变形
题目:点击打开链接题意:给定n 个城市已经 m 条路 以及对应路费c,要求遍历所有城市最少的路费,每个城市不能超过2次分析:要求每个点最多走两边,不是只可以走一次,所以要用三进制的状态压缩解决这个问题。可以预处理每个状态的第k位是什么。状态的表示 f[st][i],表示现在在i点,状态是st的最短路程。那么状态转移显而易见:f[st][i]=min( f[{st}-i][j]+原创 2016-02-26 15:20:27 · 338 阅读 · 0 评论 -
TSP问题 动态规划实现
货郎担问题(TSP)。有n个城市,两两之间均有路直接连接,求一条经过每个城市一次且仅一次,最后返回起点的最短路线。这是刘汝佳书上的一道题,他给出了思路,我实现了一下。用动态规划解决,可以假设从0点出发,然后回到0点。那么用 f(i,S)表示现在处在i点,要去访问剩余的在集合S中的点,集合S可以用二进制数st。那么状态转移方程就是:f(i,S)=min{d(j,S-{j})+dist原创 2016-02-25 20:33:10 · 3780 阅读 · 0 评论 -
poj 3311 送披萨 状压dp
题木:点击打开链接题意:位于0点小伙计给n个点送披萨,每个点可以经过多次,问送完n个点回到0的最短路程。类似于TSP问题,不过TSP每个点只可以经过一次。分析:对于这题,因为一个点可以经过多次,所以可以预处理两个点的最短距离,这个距离可以经过多次。处理完之后,就好办了,可以枚举n个点的全排列,找出最小的就好,比较简单。对于这题,当然也可以用dp,状态的表示 f[st][i]原创 2016-02-25 16:33:02 · 484 阅读 · 0 评论 -
poj 1185 炮兵阵地 状压dp
题目:点击打开链接题意:如图,大炮可以放在p处,黑色区域是可以攻击的范围,问怎么放大炮可以不会误伤,求出最大数?分析:和上一篇poj3254一样,这是这题多加了一个判断,就是还要考虑上上行的情况,其实跟上一题差不多,具体参考代码。【状态表示】dp[i][j][k] 表示第i行状态为k,第i-1状态为j时的最大炮兵个数。 【状态转移方程】dp[i][k][t] =原创 2016-02-25 09:50:30 · 282 阅读 · 0 评论 -
poj 3254 Corn Fields 状压dp入门题
题目:点击打开链接题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(一头牛都不放也是一种方案)分析:状压dp的入门题,这题就是把每一行等效成一个数,由于是由01表示的,所以很容易想到整行用一个二进制来等价,因为1表示可以选,0表示不可以选,那么这原创 2016-02-24 19:48:02 · 409 阅读 · 0 评论 -
Codeforces 629C - Famil Door and Brackets dp
题目:629C - Famil Door and Brackets题意:给出长度为m的含有()的字符串s,要求在s的前面和后面各加上一个字符串p,q(可以是空串),构成长度为n的合法串。分析:合法串就是对于任意位置的括号前缀和大于等于0,且最后的前缀和为0。枚举这个字符串前面p字符串的长度,可以使得p字符串的前缀和大于等于字符串s的最小前缀和minn,那么p+s就符合前缀和原创 2016-02-24 13:33:58 · 328 阅读 · 0 评论 -
poj 2096 概率dp
题目:点击打开链接题意:一个软件有s个子系统,会产生n种bug。 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。 求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数的期望。 需要注意的是:bug的数量是无穷大的,所以发现一个bug,出现在某个子系统的概率是1/s, 属于某种类型的概率是1/n。 分原创 2016-02-20 18:43:38 · 302 阅读 · 0 评论 -
hdu 4405 飞行棋 概率dp
题目:点击打开链接题意:跳棋有0~n个格子,每个格子X可以摇一次色子,色子有六面p(1=分析:f[i]表示从i点到n+点的期望,易见f[n]=0,比如n=3,m=0所列方程为e[0]=1/6e[1]+1/6e[2]+1/6e[3]+1 e[1]=1/6e[2]+1/6e[3]+1 e[2]=1/6e原创 2016-02-20 16:50:11 · 695 阅读 · 0 评论 -
hdu 2089 不要62 数位dp
题目:题意:给定一个区间[a,b],问在这个区间中的数字,不包含4和62的数有多少个?分析:数据范围小于1e6,如果暴力的话,再加上分解因数,预处理的时间复杂度数量级最大1e7,查询O(1)。这题主要是学习一下数位dp。暴力:#include#includeusing namespace std;typedef long long ll;const int N=100000原创 2016-02-19 21:08:18 · 291 阅读 · 0 评论 -
hdu 3652 B-number 数位dp
题目:点击打开链接题意:求小于n,是13的倍数且含有'13'的数的个数。n《1e9分析:看了别人的才写出来,点击打开链接,因为要两个要求,不含13且不是13的倍数,这样的话,可是可以用三维数组表示状态f[i][j][k],铁打不变的是i表示数位,然后增加上用j表示余数,k表示是否含有13。然后dfs,从高位开始以此判断每一位的状态,#include#include#includ原创 2016-02-20 10:14:32 · 311 阅读 · 0 评论 -
nyoj 860 变形0-1背包
又见01背包时间限制:1000 ms | 内存限制:65535 KB难度:3描述 有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 的物品,求所有挑选方案中物品价值总和的最大值。 1 1 1 1 输入多组测试数据。每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物原创 2015-12-07 18:57:54 · 294 阅读 · 0 评论 -
Codeforces 607A dp
A. Chain Reactiontime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputThere are n beacons located at distinct positions o原创 2015-12-24 21:32:23 · 631 阅读 · 2 评论 -
UVa 12283 Halloween Costumes 区间dp
题目:点击打开链接题意:这个逗比要去化装舞会,去不同的化装舞会要穿不同的衣服,而且有的化装舞会不止去一次,他可以套衣服,比如说如果这个化装舞会呆会还会来,他可以先不脱,再套上一个下一个舞会穿的衣服,给你一个去舞会的的序列,问这个人最少需要几件衣服(脱下来的衣服不会再穿)分析:这是我做的第一道区间DP题,想了许久没有思路,还是看看题解吧~~~ 区间dp。对于最左边的点:1、在该原创 2015-08-14 18:42:40 · 379 阅读 · 0 评论 -
poj 2241 The Tower of Babylon
题目:点击打开链接题意:给你无数个各种类型的砖块,(不超过30种),选择一些木块把他们来推起来,要求下面的一层比上面的一层的变长都要短,问可以堆得最高高度;分析:因为砖块的长宽高是可以互相交换的,虽然说每种砖块可以有无数个,但是用的不会超过3个,因为第四个肯定会和3个中长宽高是一样的。所以我们就可以从3*n个砖块中求解了,再将砖块按长排序,这就变成了一个背包问题了,排序可以从大到小排,然后原创 2015-08-13 23:46:29 · 457 阅读 · 0 评论 -
Uva 1291 Dance Dance Revolution
题目:点击打开链接题意:一人刚开始站在(0,0)处,然后给出一系列指令(以0为结束指令),然后这个人踩踏板,1,2,3,4,四块,具体指令见题目,问所消耗能量最少为i?分析:因为指令时 0,1,2,3,4,脚步移动情况是确定的,消耗的能量用val[][]保存,表示从I-j 位置消耗的能量,dp[n][l][r]表示做完第n个指令后左脚l位置,右脚r位置代码:原创 2015-08-13 20:30:52 · 423 阅读 · 0 评论 -
hdu 2089 数位DP
数位DP是个啥,不知道,看的这个:点击打开链接原创 2015-08-27 10:42:53 · 268 阅读 · 0 评论 -
UVa 116 例题9-4 单向TSP 多段图的最短路
算法:多段图的动态规划。因为要字典序最小,所以倒着来,设d[i][j]为从(i,j)到最后一列的最小开销,则d[i][j]=a[i][j]+max(d[i+1][j+1],d[i-1][j+1])#include#includeusing namespace std;const int maxn = 100 + 5;const int INF = 1000000000;int m,原创 2015-10-31 00:03:36 · 555 阅读 · 0 评论 -
Codeforces 474D (五一训练 F)+DP
D. Flowerstime limit per test1.5 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputWe saw the little game Marmot made for Mole's lunch. Now原创 2015-05-06 23:15:55 · 652 阅读 · 0 评论