
动态规划
文章平均质量分 67
wwwiskey
学生
展开
-
状态压缩递推(States Compressing Recursion,SCR)
我们暂时避开状态压缩的定义,先来看一个小小的例题。【引例】 在 n*n(n≤20)的方格棋盘上放置n 个车(可以攻击所在行、列),求使它们不能互相攻击的方案总数。 【分析】 这个题目之所以是作为引例而不是例题,是因为它实在是个非常简单的组合学问题:我们一行一行放置,则第一行有n 种选择,第二行n-1,……,最后一行只有 1 种选择,根据乘法原理,答案就是转载 2012-07-27 18:53:09 · 4656 阅读 · 7 评论 -
HDU 2825 Wireless Password【AC自动机+DP】
给m个单词,由这m个单词组成的一个新单词(两个单词可以重叠包含)长度为n,且新单词中包含的基本单词数目不少于k个。问这样的新单词共有多少个?m很小,用二进制表示新单词中包含基本单词的情况。用m个单词建立AC自动机,可以求出所有单词之间相互包含的情况,AC自动机的后缀特性(每个结点的失配边指向新结点,新节点到trie树根的字符串是当前节点字符串的后缀)。动态规划:f(原创 2013-08-12 14:03:46 · 1178 阅读 · 1 评论 -
HDU 4661 Message Passing 【Tree】
题意:给一棵树,每一个结点都有一个信息,每一个时刻,某一对相邻的结点之间可以传递信息,那么存在一个最少的时间,使得所有的节点都可以拥有所有的信息。但是,题目不是求最短时间,而是求最短时间的情况下,有多少种传递方式:某一时刻传递信息的双方不一样则认为是不同的传递方式。(表述的不是很清楚,自己看原题了)容易的出,最短的时间内,当然是每个节点将自己的信息想外传出去一次,并且接受一次信息,原创 2013-08-09 19:45:15 · 1864 阅读 · 0 评论 -
TC SRM 570 div2 1000【Tree,树上统计】
将一棵树上的所有结点分成两个集合(其中一个集合可以为空),但是“人类”的集合必须是联通的。问总共有多少种分法。将整棵树确定一个根,那么每个结点被选择之后,其父节点不被选择(此节点是个分界)的方案数=(所有儿子的方案数+1)的乘积。(+1表示当前子树的所有儿子都不选择)最后将所有结点作为分界的结果累加起来即可,然后+1(所有结点都不被选择)const int N = 55;c原创 2013-08-20 20:29:33 · 1185 阅读 · 0 评论 -
CF 256E Lucky Arrarys 【线段树+DP】
规定Lucky Array中任意相邻的两个数(ai, ai + 1)在w数组中为1。数组初始为0,问有多少种排列方式使数组是Lucky的。并且每次更新之后都要给出总的方案数。动态规划可以求相邻两个区间合并之后的结果f(i, j)表示当前区间以i开头,以j结尾的总方案数。那么配合更新操作,我们就可以用线段树来维护。树中每个节点上面都有一个f数组记录当前区间的方案数。对于每次更新后的询原创 2013-08-05 10:07:43 · 1107 阅读 · 0 评论 -
CF 161D Distance in Tree【树DP】
题目大意:给一棵树,求树上两点之间距离为K的点对数目。方程含义:dp(i,j)表示从已经遍历过的点到当前点i,路径长度为 j 的路径条数。因此,对于当前点,每当遍历了其中一个儿子节点的时候,首先统计当前情况下的结果,然后要更新dp(i, j)初始条件dp(i,0)= 1#include #include #include using namespace std;#d原创 2013-07-26 17:08:37 · 1940 阅读 · 0 评论 -
HDU 1059 Dividing 【DP背包】
正确高效的解法貌似要用到二进制优化背包,但是这道题目直接用bool运算和简单优化就可快速ac。背包模型:6件物品,每件物品可以取Ni件,每件物品费用为i。物品较少,直接对转移方程进行优化:F[i, j] = F[i-1, j-k*i] or F[i-1, j]二维背包很容易用压缩一维。#include #include using namespace std;int n[原创 2013-06-12 15:33:38 · 1356 阅读 · 0 评论 -
ZOJ 1880 Tug of War
拔河比赛,双方人数相差不能超过1,尽量使双方的实力接近。背包思想初始的方程,把人的“体力”作为收益,同时作为代价。F(i, j, k): 前i个人用j体力,且前i个人中使用了k个人。F(i, j, k) = max( F(i-1, j, k), F(i-1, j-a[i], k-1) + a[i] )这样就可以得到一半的最大体力值,但是本身循环的复杂度就比较高,加法操原创 2013-05-06 14:13:19 · 1460 阅读 · 0 评论 -
ZOJ 1883 Tight Words
转移方程:F(i, k) = F(i-1, k-1) + F(i-1, k) + F(i-1, k+1)F(i, k) 表示第i个位置之前的总方案数,其中最后一位为k。我很纳闷的是,这样子写,精度竟然没有问题。求出总数,然后计算百分比。#include #include using namespace std;double f[102][13];int原创 2013-05-06 15:12:58 · 1039 阅读 · 0 评论 -
ZOJ 1642 Match for Bonus
最长公共子串问题理解的话。这个就不是问题了。水……zoj这种题目好多,都没有说数据范围……只能拼rp。。。。#include #include #include using namespace std;#define N 4050int a[300];int f[N][N], n, m;char s1[N], s2[N];int main() { int t原创 2013-05-05 18:38:26 · 1167 阅读 · 0 评论 -
ZOJ 1636 Evaluate Matrix Sum
大水题。。。#include #include using namespace std;#define N 505int s[N][N], n, m, l[N];int main() { int T; scanf("%d", &T); for (int cas=1; cas<=T; cas++) { printf("Case %d:\n"原创 2013-05-05 17:50:36 · 1297 阅读 · 0 评论 -
ZOJ 1602 Multiplication Puzzle
区间dpF(i, j) = min(F(i, k) + a[i]*a[k]*a[j] + F(k, j))#include #include using namespace std;#define N 103typedef long long LL;const long long inf = 1<<29;LL f[N][N], a[N];int n;LL dp(in原创 2013-05-05 14:11:13 · 1099 阅读 · 0 评论 -
ZOJ 1563 Pearls
题意:表示看了很久没有看明白……有不同质量(quality)的珍珠,且质量高的珍珠价钱比质量低的珍珠价钱高。给每种质量珍珠的购买数量a,以及这种质量珍珠的单价。价钱计算方式:(购买数量+10)×单价质量低的珍珠可以用质量高的珍珠替代。枚举j,从j到i的这些质量的珍珠都用第i种珍珠替代。状态转移方程: F(i) = min( F(i), F(j-1)原创 2013-05-05 13:25:58 · 1268 阅读 · 0 评论 -
[HNOI2008] 玩具装箱toy
斜率优化DP。参考资料:2004周源《浅谈数形结合思想在信息学竞赛中的应用》。斜率优化部分的证明,构造下凸曲线。本题题解:C[i] 表示前 i 个玩具的长度F[i] 表示前 i 个玩具装完之后的最小费用状态转移方程: F[i] = min { F[j] + (C[i] - C[j] + i - j - 1 - L)^2 }令 S[i] = C[i] + i 则原创 2013-04-21 17:27:36 · 2303 阅读 · 1 评论 -
ZOJ 2901 MV Maker
类似floyd的动态规划 + 二分求幂裸DP的复杂度太高,写法如下:F(l, i) = max( f(l-1, j) +v[j][i] )时间复杂度为:O(n^2*L),L太大,无法接受先预处理2^p + 1长度的值,利用了二进制的思想,然后用上面DP的思想拼接。f[p][a][b] = 长度为2^p + 1, 第一个是a, 最后一个是b的最大value.原创 2013-04-18 17:39:15 · 908 阅读 · 0 评论 -
ZOJ 1475 Ranklist
组合数学,递推很多组合数的求解都是递推方法解的,多做些题目,涨涨姿势……:i个人,排j个rank的组合数,则:i-1个人把j个rank占满了,第i个人有j种rank,所以乘以j:i-1个人把j-1个rank占满了,第i个人随便插入j-1个rank中的方案有j种则,n个人的总方案数为:组合数很大,用java大数给过的……import java.util原创 2013-04-25 16:52:42 · 1261 阅读 · 0 评论 -
ZOJ 1524 Supermarket
动态规划F[i][j]:列表上第i个物品和supermarket里面第j个商品。此时可以花的最小费用。a[i] == b[j] F[i][j] = min(F[i][j-1], F[i-1][j-1] + p[j])a[i] != b[j] F[i][j] = F[i][j-1]初始化为最大值inf#include #include #in原创 2013-04-24 16:45:44 · 1201 阅读 · 0 评论 -
ACM中一类基于Markov链模型的期望问题(概率DP)
Abstract本文要讨论的是一类期望问题的解,基于以下限制:1.状态空间为一有限集合S。2.转移F:S->S是从S到S的一个映射,且该映射存在环。或者说将S画做一张图,任一状态s∈S对应图中一个点,则F为图的一个有向边集,且该图存在环。3.转移的代价C(F)为一个常量c(通常c=1)。或者说对于上面的图,任一条边的权为c。4.求从某一状态ss至另一状态st的代价期望。转载 2012-08-07 09:07:33 · 3286 阅读 · 0 评论 -
POJ 1625 Censored【AC自动机+DP+大数】
给n个字母,构成长度为m的串,总共有n^m种。给p个字符串,问n^m种字符串中不包含(不是子串)这p个字符串的个数。将p个不能包含的字符串建立AC自动机,每个结点用val值来标记以当前节点为后缀的字符串是否包含非法字符串(p个字符串中的任何一个)。状态转移方程:f(i, j) += f(i-1, k) f(i, j)表示长度为i的字符串,结尾为字符j,方程j和k的关系可以从自动机中原创 2013-08-11 16:05:08 · 2477 阅读 · 1 评论