动态规划
文章平均质量分 75
ACMiao_
Passion、Love、Action
展开
-
LightOJ 1061 N Queen Again(状压DP)
题意:给定8皇后位置,问最少多少步使得其互不攻击。思路:状压dp。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long LL;原创 2015-12-09 11:47:16 · 549 阅读 · 0 评论 -
LightOJ 1033 - Generating Palindromes(水DP)
题意:至少加多少个字符得到回文串。思路:长度-LCS。若LCS == 0,则为长度 - 1。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef原创 2015-11-23 21:49:00 · 344 阅读 · 0 评论 -
LightOJ 1051 - Good or Bad(DP)
题意:给一字符串,包括字母和问号,问号可能是任何英文字母。若出现连续3个元音或5个辅音,则为BAD,否则为GOOD。若既可能为GOOD也可能为BAD,输出"MIXED"。思路:dp1[i][j]表示到i为止,连续j个元音可否达到。dp2表示辅音。#include #include #include #include #include #include #include #in原创 2015-11-26 17:14:50 · 475 阅读 · 0 评论 -
LightOJ 1011 - Marriage Ceremonies(状压DP)
题意:n男n女,第i男与第j女结合的权值为a[i][j],求最大权值和。思路:状压dp。dp[i][s]记录前i个男生与状态数为s表示的i个女生结合的最大权值和。转移方程:dp[i][s|(1 #include #include #include #include #include #include #include #include #include #include原创 2015-11-18 17:52:40 · 418 阅读 · 0 评论 -
LightOJ 1013 - Love Calculator(LCS)
题意:给两个字符串s1和s2,求一个最短的字符串使得s1和s2均为这个字符串的字串,问这个串多长,这样的串有多少个。思路:显然,串长 = s1和s2的长度和 - LCS(s1,s2)。进行一次dp求出LCS后,再dp一次,求出种数。cnt[i][j]表示s1的前i和s2的前j求得满足对于s1前i和s2前j的串有多少种。显然,当s1[i] == s2[j]时,我们只能以s1[i]这个字符结尾;不原创 2015-11-18 19:49:00 · 668 阅读 · 0 评论 -
LightOJ 1032 Fast Bit Calculations(数位DP)
题意:给一个n,问从0~n的所有数,二进制包含的"11"一共有多少个。思路:dp[i][j]维护长度为i,以j开头(0dp[i][0] = dp[i-1][0] + dp[i-1][1]; dp[i][1] = dp[i][0] + (1 j == 0时,显然,直接从dp[i-1]为多少dp[i][0]就有多少。j==1时,除了包含dp[i-1]的情况,还要考虑,原创 2015-11-23 21:05:01 · 372 阅读 · 0 评论 -
LightOJ 1036 - A Refining Company(DP)
题意:镭提炼厂在北边,铀在西边。传送带不可交叉,可从东往西或从南往北传。问最多传送多少矿。思路:a[][]维护横向即铀矿的前缀和,b[][]维护镭矿前缀和。dp[i][j] = max(dp[i-1][j] + a[i][j], dp[i][j-1] + b[i][j])。#include #include #include #include #include #includ原创 2015-11-24 16:55:10 · 660 阅读 · 0 评论 -
LightOJ 1038 - Race to 1 Again(期望DP)
题意:给一个n,每次操作可以选n的一个因子除n,直到其为1。求操作次数的期望。思路:dp[n]表示n的操作次数期望。设n有cnt个因子,那么每次如果取的是2~n之间的因子,则有(dp[x] + 1) * (1 / cnt);若为1,则有(dp[n] + 1) / (1 / cnt)。得到等式:dp[n] = ((dp[a] + 1) + (dp[b] + 1) + ... + (dp[x]原创 2015-11-24 21:11:21 · 361 阅读 · 0 评论 -
LightOJ 1025 - The Specials Menu(区间DP)
题意:给一个字符串,问删掉任意个字符串后为回文串的有多少个。思路:很明显的区间DP。dp[i][j]记录从i到j的字符串删掉字符后可以得到回文串的种数。这里对于每一个i和j,无需扫描i和j中间的k值来更新,因为dp[i][j]只和i+1和j-1的字符有关。有两种情况:1)s[i] != s[j]时,我们考虑dp[i][j]从dp[i+1][j]和dp[i][j-1]转移,删掉s[j],dp原创 2015-11-19 20:11:00 · 376 阅读 · 0 评论 -
LightOJ 1031 Easy Game(区间DP)
题意:A,B轮流从左或从右以最优策略选出连续的几个数,直至选完,求两人所选数和差的最小值。思路:dp[i][j]表示先手者A选区间[i, j]的最优策略和。A要让B得到的和最小,所以先求出让B最优策略得到的最小数字和,即 tmp = min(dp[i][k], dp[k+1][j]),其中 i #include #include #include #include #include原创 2015-11-20 20:26:12 · 347 阅读 · 0 评论 -
LightOJ 1047 - Neighbor House(DP)
题意:n个房子涂色,相邻须不同色。涂色有不同花费,求最小花费。思路:dp[i][now][last]表示到第i个房子,现在涂now色,上一次涂last色的最小花费。代码略长,但意思比较清楚。#include #include #include #include #include #include #include #include #include #include原创 2015-11-25 16:46:25 · 417 阅读 · 0 评论 -
LightOJ 1050 - Marbles(概率DP)
题意:红蓝两种球。你每次可随机拿一个,Jim每次只能拿蓝球。若Jim无球可拿,则他赢。若最后一个被拿的是蓝球,不管谁拿的都是你赢。否则Jim赢。求你赢的概率。思路:dp[i][j]表示i个红球j个蓝球时你赢的概率。由于Jim悲催到只能拿蓝球,因此只有两个转移方向。则有dp[i][j] = dp[i-1][j-1] * i / (i + j) + dp[i][j-2] * j / (i +原创 2015-11-25 23:25:09 · 393 阅读 · 0 评论 -
LightOJ 1021 Painful Base(状压DP)
题意:对一个base进制数,给出它可以包含的数字,对这个数进行全排列,问多少种可以整除k。思路:base不超过16,看到这个数据量可以想到状压,再联系数位DP。得到转移方程dp[i][nmod] += dp[i - (1#include #include #include #include #include #include #include #include #include原创 2015-11-19 17:15:15 · 349 阅读 · 0 评论 -
LightOJ 1037 - Agent 47(状压DP)
题意:特工杀人,起始手枪一枪伤害为1。杀谁得到谁的武器。并且已知每个武器对每个敌人一枪的伤害。问最少多少枪干掉所有人。思路:最多就15个人,很容易想到状压。a[s][i]表示,已杀过的人的状态为s,对第i个敌人一枪可造成的最大伤害。dp[s]表示杀过敌人状态为s最少要多少枪。状态表示一想到,剩下的就很水了。预处理一下a数组,再跑遍记忆化。Done.#include #include #原创 2015-11-24 17:53:46 · 405 阅读 · 0 评论 -
LightOJ 1044 - Palindrome Partitioning(DP)
题意:求出最少可以将s划分成几个回文串。思路:dp[i]表示从s[1...i]最少可以划分成几个回文串。则对1 #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;原创 2015-11-24 23:28:03 · 449 阅读 · 0 评论 -
LightOJ 1030 Discovering Gold(期望DP)
题意:n个位置,每处有一定价值。从1开始,扔骰子,扔几走几,走到哪就去那个点的价值,直到走到n。如果掷出的点数超过了n就重新掷。问到达n得到金子价值的期望。思路:dp[i] = (dp[i+1] + ... + dp[i+j]) / tot,其中1 #include #include #include #include #include #include #include #原创 2015-11-20 15:42:27 · 370 阅读 · 0 评论 -
LightOJ 1017 - Brush (III)
题意:坐标系上的n个点,一个宽度为w的刷子,最多刷k次,一次可以水平刷掉经过的所有点。问最多刷掉多少点。思路:显然要对点离散化处理,由于是水平刷一刷到底,所以直接忽略横坐标。纵坐标排序,然后从上往下dp。dp[i][j]表示第j次刷,从第i个点开始刷最多刷多少个点。我们先对n个点第一次刷的预处理,可以O(n)得到dp[i][1]的值,即从第i个点横向刷可以刷掉几个点。转移方程 dp[i][k]原创 2015-11-18 20:31:35 · 363 阅读 · 0 评论 -
UVa 10635 - Prince and Princess(DP)
题意:LCS。思路:LIS。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long LL;#define mem(a, n)原创 2015-11-27 15:42:58 · 433 阅读 · 0 评论 -
LightOJ 1068 - Investigation(数位DP)
题意:给定区间求被k整除且数位和被k整除的个数。思路:数最多10位,所以数位和不会超过90,那么k > 90时一定为0了。因而dp数组开到90就好。#include #include #include #include #include #include #include #include #include #include #include #include us原创 2015-12-09 13:55:51 · 431 阅读 · 0 评论 -
HDU 3709 Balanced Number(数位dp)
题意:若某数,固定某位为支点,得到平衡的则称为平衡数。给定区间问有多少个。思路:数位dp。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef l原创 2015-12-07 16:45:43 · 393 阅读 · 0 评论 -
HDU 4507 恨7不成妻(数位dp)
题意:中文题略。思路:dp[pos][pre1][pre2],pos位,pre1各位数字和模7,pre2数模7。得到下一位平方和时利用平方和公式:如223 ^ 2 = (200 + 23) ^ 2 = 200 ^ 2 + 2 * 200 * 23 + 23 ^ 2。#include #include #include #include #include #include #原创 2015-12-07 16:18:35 · 472 阅读 · 0 评论 -
求字符串最长连续不重复的字串
思路:dp[c]记录字符c上一次出现的位置。l记录上一个连续不重复字串的左边界,这样就可以更新连续不重复子串的长度。我这里输出的是第一次出现的最长的连续不重复子串。#include #include #include #include #include #include #include #include #include #include #include #inclu原创 2015-12-23 23:30:09 · 1171 阅读 · 0 评论 -
HDU1257 最少拦截系统(LIS)
题意:中文题。思路:求递减序列有几条。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long LL;#define mem(a原创 2015-12-22 00:28:04 · 467 阅读 · 0 评论 -
UVa 10651 Pebble Solitaire(状压DP)
题意:110->001,011->100。问最后最多少几个1。思路:状压DP水题。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long原创 2015-12-04 13:03:05 · 475 阅读 · 0 评论 -
HDU2546 饭卡(01背包)
题意:中文题。思路:01背包,求能购买的价值最后减去。由于大于等于5时才可购买,所以价钱大的最后买,也就是先更新大的,再更新小的。所以要从大到小排序。#include #include #include #include #include #include #include #include #include #include #include #include u原创 2015-12-20 01:02:18 · 556 阅读 · 0 评论 -
LightOJ 1057 - Collecting Gold(状压DP)
题意:从起点出发,采到所有金子回到起点的最小步数。可以走8个方向。思路:dp[s][j]表示经过的点的状态s,回到i的最小步数。怎么算回到j点的步数呢?我们更新状态时得到新的点i,所以算i到j的最小步数。转移方程:dp[newState][j] = min(dp[newState][j], dp[s][i] + Dis(x[i] - x[j], y[i] - y[j]));#include原创 2015-12-01 16:16:42 · 477 阅读 · 0 评论 -
HDU 1059 Dividing(多重背包)
题意:多重背包。思路:dp[weight] = max(dp[weight], dp[weight - k * cost] + k * value]), k #include #include #include #include #include #include #include #include #include #include #include #includ原创 2016-01-04 10:05:06 · 528 阅读 · 0 评论 -
Codeforces Round #334 (Div. 2) C. Alternative Thinking
题意:翻转连续字串,使得‘10101....'子串最长。思路:乍一看是dp,其实不用。翻的子串的不相邻长度是不变的。因此只需找'11'和'00'就可以了。由于只有字串边界有影响,因此最多增长2,且不会比原串小。#include #include #include #include #include #include #include #include #include #in原创 2015-12-02 10:37:48 · 729 阅读 · 0 评论 -
UVa 11021 Tribles(概率DP)
题意:k个虫,活一天,死后生虫。生i只(0 思路:事件相互独立。全概率公式。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long lon原创 2015-12-01 15:45:56 · 377 阅读 · 0 评论 -
HDU 5587 Array
题意:一个序列初始为{1},每次复制整个序列添加到原序列后面,并在两个序列间再添个0,所有新增的数字加1。求前M项和。思路:官方题解是数位DP(玄学)。 自己打了张表找规律,发现对 2^x - 1,其和为 sum(2^(x-1) -1) * 2 + 2 ^ (x-1)。为了方便对于前M项和用sum(M+1)表示。注意到每次复制后项数为2 ^ x - 1。显然是和二进制有原创 2015-11-28 21:28:50 · 349 阅读 · 0 评论 -
LightOJ 1084 - Winter(记忆化搜索)
题意:每人最多走k步,所有人走成若干堆,问最少走成多少堆。思路:记忆化搜索。dp[i]表示从i开始最少走成多少堆,next表示最多走到的位置。由于每堆至少3个人,所以得到next值以后分3种情况,next,next - 1,next - 2开始。由于cur能到的话cur+1也一定能到,因此可以得到转移方程。#include #include #include #include #i原创 2015-12-14 23:17:05 · 524 阅读 · 0 评论 -
HDU 4336 Card Collector(状压期望DP || 容斥原理)
题意:n张卡,选到第i张概率为p[i],求取到n张的期望次数。思路:状压期望DP。设取不到卡片概率为none,状态s里为1的位表示已经取到的卡片。求解dp[s],枚举s里为1的位i,则拿到新卡片的概率为sigma(p[i]),拿不到或拿到已有的概率为 1 - sigma(p[i])。这样有dp[s] = (1 - sigma(p[i])) * dp[s] + sigma(p[i] * dp原创 2015-11-28 12:12:01 · 516 阅读 · 1 评论 -
LightOJ 1071 - Baker Vai(水DP)
题意:两个机器人从(1, 1)到(n, m),除了终点外不可相遇。求路径最大价值。思路:水DP。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typede原创 2015-12-10 17:09:05 · 550 阅读 · 0 评论 -
HDU 5569 matrix(DP)
题意:nxm矩阵,从(1, 1)走到(n, m),只能往下或往右,求最小的 a1 * a2 + a3 * a4 + ... + a(n+m-2) * a(n+m-1)。a的下标k为第k步走的格子的值。思路:偶数步加积,奇数步的话就按上一步的值算。#include #include #include #include #include #include #include #in原创 2015-11-21 23:49:27 · 460 阅读 · 0 评论 -
HDU 5568 sequence2(大数+DP)
题意:给一个序列,问有多少个长度为k的上升子序列(对i 思路:看到上升子序列应想到dp。dp[i][j]表示以a[i]结尾长度为j的上升子序列有多少个。那么得到转移方程:dp[i][j] = sum{dp[k][j-1]},其中 1 注意此题要用大数BigInteger。#include #include #include #include #include #include原创 2015-11-22 11:21:02 · 503 阅读 · 0 评论 -
POJ 1651 Multiplication Puzzle(区间DP)
http://poj.org/problem?id=1651。头尾不动。通过从小到大枚举长度枚举区间,然后扩散到整个区间。dp[i][j]表示从i开始到j的区间的分数最小值。则长度显然从3开始。得到状态转移方程 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + a[i] * a[k] * a[j])。答案为dp[0][n-1]。#in原创 2015-10-26 21:05:26 · 345 阅读 · 0 评论 -
HDU 2415 Bribing FIPA(树形背包)
做的第一道树形背包,应该算是入门题。给定n个国家,相互间有统治附属关系,可以贿赂m个国家,贿赂某个国家同时其附属国也被直接贿赂。 思路:按附属关系连有向边,将其变成一棵树,于是就成了一棵树上的01背包。找到度数为1的节点开始dfs,dfs到某个国家时,先深搜其附属国,完成其附属国的DP,最后再到自己。 代码:// Header.#include #include #i原创 2015-09-07 00:03:13 · 533 阅读 · 0 评论 -
HDU 1506 Largest Rectangle in a Histogram(DP)
用l[i]和r[i]存i向左向右所能达到的最远的比它高的点,最后扫一遍得出答案。复杂度O(nlogn)。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;type原创 2015-11-06 17:47:44 · 266 阅读 · 0 评论 -
ZOJ 3469 Food Delivery(区间DP,经典题)
题目大意:有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员得以V-1的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加一倍,值达到一定程度,该家庭将不会再订购外卖了,现在为了以后有更多的家庭订购,要将外卖送到的情况下使得所有用户的不开心值总和达到最小很明显,每多走一分钟,没送到的家庭的不开心值都会加倍。dp[i][j][0]记录从i到j区间最小原创 2015-10-29 18:59:55 · 373 阅读 · 0 评论 -
POJ 3361 Running
题意:给你一个n,m,n表示有n分钟,每i分钟对应的是第i分钟能跑的距离,m代表最大疲劳度,每跑一分钟疲劳度+1,当疲劳度==m,必须休息,在任意时刻都可以选择休息,如果选择休息,那么必须休息到疲劳度为0,当然,当疲劳度为0的时候也是可以继续选择休息的,求在n分钟后疲劳度为0所跑的最大距离dp[i][j]表示第i分钟疲劳度为j时所跑的最大距离。在疲劳度为0时,我们可以继续休息。则此时有转移原创 2015-10-30 13:35:14 · 369 阅读 · 0 评论