动态规划
文章平均质量分 62
zz_ylolita
这个作者很懒,什么都没留下…
展开
-
noip2005提高组过河
介于被这道题折磨了一晚上,因此很有必要记录下来做动态规划及状态压缩中原创 2014-08-03 00:02:28 · 1215 阅读 · 0 评论 -
数位DP
hdu 3555 多组数据,问从1~n中有多少个数包含"49" 注意:数位DP最后统计答案的时候,*b[i]的计数表示0~b[i]-1种选法,统计的是比b[i]少1开头的数字之后有多少种,不会重复计算。 就像一棵十叉数,n+1在某一个叶子节点上,每次统计一层左子树的答案,然后下一层,再累和,所以从高位到低位循环。 #include #include #include #include原创 2015-10-29 20:49:44 · 340 阅读 · 0 评论 -
1010: [HNOI2008]玩具装箱toy
原来的DP式子: 设f[i]为前i个玩具装箱的总费用 f[i] = min{ f[j]+ (i-(j+1)+s[i]-s[j]-l)^2 } 展开得 令g[i]=i+s[i] h[j]=j+1+s[j]+l f[i] = min{ f[j]+(g[i]-h[j]) ^2} = min{f[j] + h[j] ^ 2 - 2 * g[i] *h[j] } + g[i] ^ 2 设j1原创 2016-01-29 12:56:15 · 1563 阅读 · 0 评论 -
bzoj1084: [SCOI2005]最大子矩阵-DP
现在已经能自然的想到分类讨论了。 注意到m=1或者2,当m=1时,是普通的最大连续字段和,只不过是k个: 设f[i][j]表示前i个数中取出j个矩形的最大和 转移: 选:f[i][j]=max{f[i1][j-1]+s[i]-s[i1-1]} 不选:f[i][j]=max(f[i][j],f[i-1][j]) 复杂度O(n^2*K) 当m=2时,设w[i][j][k]表示第一列选到第原创 2016-02-10 00:28:08 · 1950 阅读 · 1 评论 -
bzoj1026: [SCOI2009]windy数-数位DP
问题描述 windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 数位DP 分成两步:求总共的DP和统计答案 DP: dp[i][j]表示i位数字,最高位为j的windy数的个数 dp[i][j]=sum(dp[i-1][k]) |j-k|>=2 边界dp[1][j]=原创 2016-02-27 21:49:38 · 3052 阅读 · 0 评论 -
[hihocoder]太阁最新面经算法竞赛8]A.A Game
题目大意:小hi和小ho玩游戏,给出一个数列,两人每次从数列的头尾取数,小ho 先取,小hi每次都采取最优策略,问小ho最终能取得的数的总和最大是多少。 分析:一开始想贪心,但贪心不行,不知道以前从哪本书上看到说每个人都只能去奇数位或偶数位上的数,但显然这是不对的。 那么就dp吧,一个区间dp。因为两个人轮流取数,而且都执行最优策略,那么只要求某个长度下某人执先手可以取得的最大和就可以转移了。原创 2016-07-16 12:30:39 · 671 阅读 · 0 评论 -
[hihoCoder太阁最新面经算法竞赛8]B.Dice Possibility
描述 What is possibility of rolling N dice and the sum of the numbers equals to M? 输入 Two integers N and M. (1 ≤ N ≤ 100, 1 ≤ M ≤ 600) 输出 Output the possibility in percentage with 2 decimal pla原创 2016-07-19 00:25:00 · 577 阅读 · 0 评论 -
hdu4607 Park Visit 树形DP版
题目大意:给一棵树,要经过K个不同的点,求走的路径最短是多少。每一条树上的边长度都是1. 先用DP求出树的直径len(表示直径上的边数)。 如果k 如果k>len+1,答案为沿着直径走,遇到比较好的岔路口就进去再出来,因为不要求方案,所以默认她会走。。。 len + 2*(k-len-1) 在dog的帮助下理解了后面为什么这样算,学文化课大概真的会把脑子学坏。。。 #includ原创 2017-07-28 11:41:33 · 405 阅读 · 0 评论 -
noip2013truck树上路径倍增
#include #include #include #include #include using namespace std; #define INF 0x7fffffff int n,m,x,y,z,l,s,u,v,q; bool vis[10010]; struct point{ int x,y,z; }a[50010]; struct node{ int y,z,next;原创 2015-11-07 22:45:43 · 770 阅读 · 0 评论 -
hiho一下第六十周
题目大意:给出两个字符串,求出满足下列条件的最长的公共子序列: ①公共子序列连续的部分长度>=3 ②断开处单调递增 分析:看起来好像经典问题最长公共子序列——但是不是。一开始想到直接写转移方程,发现如果前面长度为2,1之类,即使和后面连起来长度大于3了,这种状态也不能被找到;又想到先求最长公共子序列,然后减去小于3 的段,但是发现不仅程序中定位断开部分难写,而且会产生错解。 所以接着第一个原创 2015-08-29 00:44:01 · 371 阅读 · 0 评论 -
noip2001统计单词个数
10 4 aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa原创 2014-08-03 00:58:08 · 2008 阅读 · 0 评论 -
最短编辑距离 poj3356
有三种情况可以导致我们上面设计的状态会发生转移。我们现在来看A[i] 和 B[j] , ①、我们可以在 B[j]后面插入一个核苷酸(即一个字符)ch,ch==A[i],这样做的话, 至少需要 dp[i - 1][j] + 1步操作,即 dp[i][j] = dp[i - 1][j] + 1。 ②、我们可以删除 B[j],这样的话,B[1...j] 变为A[1...i] 需要 dp[i][j原创 2014-10-06 18:21:25 · 414 阅读 · 0 评论 -
[noip2006]能量项链 区间DP
program tt; var n,i,l,j,k,ans:longint; a:array[1..300]of longint; f:array[1..300,1..300]of longint; function max(a,b:longint):longint; begin if a<b then max:=b else max:=a; end; begin原创 2015-07-19 15:16:36 · 984 阅读 · 0 评论 -
[noip2010]乌龟棋
要注意读题,他已经在第一个格子,所以每走一步取得是再+1的格子中的数 program tt; var n,m,i,b,j,k,l:longint; a:array[0..350]of longint; f:array[-1..40,-1..40,-1..40,-1..40]of longint; c:array[1..4]of longint; function max(原创 2015-07-20 00:38:39 · 583 阅读 · 0 评论 -
poj1179polygon
只要注意负负得正,所以要保存最大和最小值 但我一开始区间起始位置枚举没有写到2*n-1,使得后面的小区间没有办法枚举到,然后WA了 痛定思痛!program polygon; var n,l,i,j,k,t:longint; maxx:int64; ch:char; f,g:array[0..150,0..150]of longint; b:array[0..1原创 2015-07-20 00:03:23 · 592 阅读 · 0 评论 -
斜率优化 [Usaco2008 Mar]土地购买
orz..一开始没看数据范围,这题长*宽后要用int64 方程f[i]=min{f[k]+x[i]*y[k+1]} 可以用斜率优化 然后维护一个凸包,可以用单调队列维护每次斜率最优的 program tt; var n,i,tail,l,r:longint; q,f,a,b:array[0..50000]of int64; procedure qsort(x,y:原创 2015-07-20 18:25:43 · 575 阅读 · 0 评论 -
状态压缩DP noi2001炮兵阵地
要注意影响两行就以最后两行为dp的状态 program cannon; var n,m,i,j,l,tt,k,k1,aa,t,ans:longint; s,s1:array[-1..100]of longint; b:array[0..20]of byte; m2:array[0..10]of longint; ch:char; flag:byte;原创 2015-07-21 00:24:11 · 541 阅读 · 0 评论 -
斜率优化——apio2010特别行动队
这是我写的第二个斜率优化。。。 有了更深的认识 发现斜率优化很神奇,加一个斜率和单调队列就可以了 发现是斜率优化重点是找到f[i]=min(max){f[j]+w[j,k]}这样一个DP方程,然后试着对决策j优于k列式子讨论,作数学变形。发现有一边是dp[]之差比定值[j] [k]之差就是斜率。 还有要注意斜率可以用slop算出来,这样程序更清晰,条件也比较好看 program tt;原创 2015-07-20 23:43:21 · 703 阅读 · 1 评论 -
百度之星2017 资格赛 1003 度度熊与邪恶大魔王
完全背包 这题要考虑到怪兽的数目100000很多,但是生命值1000和防御力10很小,并且招数种类1000也不大,(根据抽屉原理)说明有很多生命值或者防御力重复的怪兽。因此我们没有必要一个怪兽一个是怪兽大,只要对每种生命值和防御力的怪兽进行每种招数的转移即可。 dp[i][j]表示消灭生命值为i,防御力为j的怪兽最少消耗的冰晶石数 dp[i][j] = min ( dp[i][j], dp[原创 2017-08-06 20:07:15 · 633 阅读 · 0 评论