
dp
bllsll
巴拉拉,起飞。
展开
-
Wooden Sticks POJ 1065 (LDS)
这个题是一开始学贪心的时候刷的,思路是先排个序,按照l,然后找w有多少个上升序列#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int maxn = 5005;struct node{ int原创 2017-05-10 10:50:09 · 245 阅读 · 0 评论 -
矩形嵌套 DAG
DAG上的动态规划。 排完序后,其实就是求最长递增子序列吧。这里要注意的是,我们排序的时候,以为它说可以翻转,所以我们把哪个边长短的放在前面,长的放在后面,再排序。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 10原创 2017-05-31 16:44:39 · 369 阅读 · 0 评论 -
Famous Stone Collector HDU - 4248 组合数学+dp
题意:给你n种物品的数量,相同物品不能区分,不同物品可以区分,问你排列的总数量。之前做过dp的计数问题,是计算组合的总数量。排列的总数量就是状态方程改了一下。dp[i][j]=(dp[i][j]+dp[i-1][j-k]*c[j][k]%inf)%inf;//c[i][j]:在j个位置上取k个的方案数。 因为数组大小,WA了几发。。为什么不出RE。。#include <iostream>#inc原创 2017-07-07 11:37:15 · 275 阅读 · 0 评论 -
HDU 6148 数位dp
题意:给你一个区间[1,r],然后在这个区间中的数字,从左往右看如果是先递增再递减的,这个就是山峰数,求这个区间中不是山峰数的数量。。分析:开始题目看错了,原来一个数字中只用出现一段是先增后减的,就算山峰。。比如12100-12199都是山峰数#include <iostream>#include <cmath>#include <algorithm>#include <cstdio>#in原创 2017-08-22 18:51:32 · 226 阅读 · 0 评论 -
Palindromic Numbers LightOJ - 1205
题意:给你一个范围 i j (0≤i,j≤1017).(0 ≤ i, j ≤ 1017).,问你在这个范围中的数字有多少是回文数#include <iostream>#include <cstring>#include <algorithm>#include <cmath>#include <cstdio>#include <vector>#include <set>#include原创 2017-08-22 20:55:12 · 273 阅读 · 0 评论 -
数位dp
这个是数位dp的入门。首先看到数据范围,就情不自禁地打了一张表。这个打表的时间复杂度为O(n*6),每次询问是O(1),是可以过 的这个是作为数位dp的入门,肯定要用数位dp来写一写啦 参考:http://blog.youkuaiyun.com/wangyuquanliuli/article/details/13761661 首先状态为dp[i][j]表示i位数,最高位(也就是i位)为j的时候,数量是多少原创 2017-08-20 22:55:37 · 415 阅读 · 0 评论 -
Activation HDU - 4089 概率期望dp
题意: n个人排队激活,对于队列中的第一个人,在激活的时候有以下五种情况: 1.激活失败:留在队列中继续等待下一次激活(概率p1) 2.失去连接:激活失败,并且出队列然后排到队列的尾部(概率p2) 3.激活成功:出队列(概率p3) 4.服务器瘫:服务器停止服务了,所有人都无法激活了(概率p4) 求服务器瘫痪并且此时Tomato在队伍的位置在<=k的概率,也就是前面原创 2017-11-07 13:13:12 · 295 阅读 · 0 评论 -
序列分割 HYSBZ - 3675 斜率dp
小H最近迷上了一个分隔序列的游戏。在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列。为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首先选择一个长度超过1的序列(一开始小H只有一个长度为n的序列——也就是一开始得到的整个序列); 2.选择一个位置,并通过这个位置将这个序列分割成连续的两个非空的新序列。 每次进行上述步骤之后,小H将会得到一定的分数。这个原创 2017-11-08 00:07:25 · 266 阅读 · 0 评论 -
HDU 4035 Maze 期望dp
题意:这是一个树形的迷宫,一个人从1节点开始走,他会任意选择一条边走,然后每到一个节点i,有Ki的概率被kill,然后从1节点继续开始,有Ei的概率逃出这个迷宫。问逃出迷宫的期望分析;这个题和上一题的丢骰子的题很像; dp[i]:i节点逃出去的期望是多少。然后最后的答案就是dp[1]如果i是叶子节点 dp[i]=K[i]dp[1]+E[i]*0+(dp[father]+1)(1-K[i]-E[i原创 2017-11-08 14:35:37 · 244 阅读 · 0 评论 -
Zuma HDU - 6212 (区间dp)
题意:祖玛游戏。给一串01序列。每大于等于三个相同的连在一起的话,就可以消去。往序列中间加一个0或者1称为一个操作,问要将序列全部消掉,最少需要多少个操作 分析:开始的想法是 dp[i][j]:下标从i到j全部消去最少需要的操作数 然后写完之后,wa了。 原因是如果s[i]=s[j]的时候,如果左端相同+右端相同的数量大于3的时候就不能在中间找数和两端一起消去了,因为当左端+右端相同的数量>原创 2017-10-14 11:02:32 · 405 阅读 · 0 评论 -
HDU 6082 度度熊与邪恶大魔王(完全背包)
分析:n很大,但是怪物的防御力只到10.枚举一下防御力,然后对技能完全背包 dp[i][j]:防御力为j,生命力为i的最少晶石数这个题主要是细节要注意感觉#include <iostream>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#include <cstdio>using names原创 2017-10-14 18:58:14 · 294 阅读 · 0 评论 -
Cross the Wall UVALive - 5097 (贪心+斜率dp)
前几天做的一道题。这个题感觉还是蛮好的,之后的要注意这方面的贪心题意:有n个人要通过墙,每个人有高度h和宽度w,我们最多可以建k个门。第i个人要通过墙的条件是门的高H>hi,门的宽W>wi。建一个高H,宽W的门,代价是W*H。问这n个人过墙的最少的代价分析:先贪心去重。如果两个人(w1,h1),(w2,h2),如果w1<=w2&&h2<=h2,那么第一个人就可以不用考虑了,因为如果第二个人可以通过,原创 2017-10-25 21:17:24 · 36062 阅读 · 0 评论 -
Scout YYF I POJ - 3744 概率dp
Scout YYF I POJ - 3744 题意:这个题意很好懂~就是讲一个人要走一条路(一维),从坐标1开始走,在当前位置他往前走一步的概率是P,走两步的概率是1-p。然后路上有n个炸弹,问能安全走完这段路的概率是多少。分析: 状态转移: dp[i]=dp[i-1]p+dp[i-2](1-p); 然后如果i位置有炸弹的话dp[i]=0; 但是炸弹的位置可以到1e8,这个都存不下,如果存的下原创 2017-11-04 19:13:01 · 251 阅读 · 0 评论 -
Collecting Bugs POJ - 2096 期望dp
题意:有s个子结构,n种bug,每天都会发现一个bug,问发现n种bug,且每个子结构中都有bug的期望是多少分析: 开始想状态是: dp[i][j]:bug在i个子结构中,j种bug的期望天数, 然后由dp[i-1][j],dp[i-1][j-1],dp[i][j-1],dp[i][j]转移过来, 但是这四种状态转移到dp[i][j]的概率是一样的么?比如:假设 dp[i]:表示转移到i原创 2017-11-04 20:41:47 · 246 阅读 · 0 评论 -
最长上升子序列(LIS)
问题:有一个长为n的数列,a1,a2,…..an-1。请求出这个序列中最长的上升子序列的长度。上升子序列指的是对于任意的ifor(int i=0;i<n;i++){ dp[i]=1; for(int j=0;j<i;j++) { if(a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1); }原创 2017-05-05 15:13:58 · 355 阅读 · 0 评论 -
Dollar Days POJ 3181 完全背包+高精度
这个和之前的Sumsets差不多,都是完全背包的模板题 但是这个我们要注意的是数的范围比较大,已经超了long long 了,我们需要用到高精度模拟高精度加法#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;const原创 2017-05-10 09:40:42 · 438 阅读 · 0 评论 -
Making the Grade POJ 3666 求非严格递减的序列最小值
题意:有n个数,然后将之变为非严格递减或者严格递增的序列这个题比较弱,然后只用非递减 就好了 dp[i][j]:前i个数的序列,最后一个数是第j大的数的最小值 dp[i][j]=min(dp[i-1][k])+abs(a[i]-b[j]);(1<=k<=j);#include <iostream>#include <cstdio>#include <cstring>#include <al原创 2017-05-11 11:10:52 · 305 阅读 · 0 评论 -
Ant Counting POJ - 3046 多重组合数
题意:就是有t(t<1,000)种蚂蚁,然后每种有ni个(n<100),a为所有蚂蚁的数量,然后给你一个范围,s,b(0#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>using namespace std;const int maxn =1005;int原创 2017-05-10 01:27:03 · 353 阅读 · 0 评论 -
Space Elevator POJ 2392 01背包/多重背包+二进制
题意:n种瓷砖,每种有对应的高度和数量,以及不能超过的高度,问最高堆多高(感觉自己的总结能力真的是有点差多重背包 算了一下,用01背包来做不会超时,但是在中间真的是wa的想哭 1.手误把排序的东西写错了,,if(),后面的是对的 2.最后要扫一遍,不一定最大的是最后一个#include <iostream>#include <cstdio>#include <cstring>#inclu原创 2017-05-11 20:40:35 · 224 阅读 · 0 评论 -
递推求解专题练习(For Beginner)
这里写链接内容HDU 2044 一只小蜜蜂…有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。 其中,蜂房的结构如下所示。 这个先用dfs写了一下,肯定是超时的,然后看了一下,发现a到b其实就是1到b-a+1; 然后打个表出来就好了 对于每个数n都是从n-1,n-2来的 f[n]=f[n-1]+f[n-2]#include <io原创 2017-05-08 19:13:49 · 566 阅读 · 0 评论 -
poj 2229 B - Sumsets
题意:给你一个n,问你有多少个组合加起来可以等于n(组合里的数都是2的幂) 1 <= N <= 1,000,000如:n=71) 1+1+1+1+1+1+1 2) 1+1+1+1+1+2 3) 1+1+1+2+2 4) 1+1+1+4 5) 1+2+2+2 6) 1+2+4 一共有6种方法一:用完全背包来做 因为n的范围为1000000,然后2的幂,可能取值有20个 然后递推关原创 2017-05-05 18:39:45 · 512 阅读 · 0 评论 -
Apple Catching POJ - 2385
题意:一共有T个时间,然后每个时间1树或者2树会掉一个苹果下来,小牛想要接苹果,跑到另一个树下为一次运动,给你小牛最多能运动的次数,然后小牛开始0时间在1树下,问你小牛最多可以接几个苹果; 写下状态表达式: dp[i][j]:在第i个时间点反转了j次,最大可以获得的apple 状态转移方程: dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+g;dp[i-1][j-原创 2017-05-08 21:20:04 · 329 阅读 · 0 评论 -
Milking Time POJ - 3616
题意:一共有n个任务,然后给你每个任务的开始时间 和结束时间以及这个任务能达到的价值。然后每次做完一个任务后要休息r个时间,问你最大可以得到的价值和 这个比贪心中的节目问题多了一个权值。然后用动态规划,其中的时间要排序。 dp[i]:表示在做第i个任务得到的最大价值和 然后两重循环//刚开始想的是用dp[i]:第i时间的最大价值,然后超时了。#include <iostream>#inclu原创 2017-05-06 11:23:20 · 345 阅读 · 0 评论 -
多重部分和问题 多重背包&& Coins POJ - 1742
问题:有n种不同大小的数字a,每种各mi个。判断是否可以从这些数字之中选出若干使他们的和恰好为k。 dp[i][j]:用前i种数加和得到j后最多可以剩余多少个(不能加的为-1)dp[i][j]=m[i] if(dp[i-1][j]>=0) =-1 else if(j#include <iostream>#include <cstring>#inclu原创 2017-05-09 10:36:57 · 651 阅读 · 0 评论 -
dp初步
Cow Bowling POJ - 3176(数字三角形) poj 2229 B - Sumsets 完全背包OR递推 Apple Catching POJ - 2385 Milking Time POJ - 3616 n个任务,每个任务都有权值和时间区间,问你选哪些不重合的时间,使得权值最大 Palindrome (回文数) poj 1159 问最少添加几个可以使之成为回文数 LCS原创 2017-05-07 13:59:24 · 408 阅读 · 0 评论 -
矩阵连乘
求矩阵A1(3×2)、A2(2×5)、A3(5×10)、A4(10×2)和A5(2×3)连乘的最佳计算次序。则P=[3,2,5,10,2,3]#include <iostream>#include <cstring>#include <cmath>#include <cstdio>#include <vector>#include <set>#include <map>using na原创 2017-04-27 09:53:33 · 1027 阅读 · 0 评论 -
多重集组合数问题
参考http://blog.youkuaiyun.com/viphong/article/details/48110525题目: 有n种物品, 第i种物品有a个. 不同种类的物品可以互相区分, 但相同种类的无法区分.从这些物品中取出m个, 有多少种取法? 求出数模M的余数.例如: 有n=3种物品, 每种a={1,2,3}个, 取出m=3个, 取法result=6(0+0+3, 0+1+2, 0+2+1, 1原创 2017-05-10 00:32:39 · 2497 阅读 · 0 评论 -
One Person Game ZOJ - 3329 期望dp
题意:有三个骰子,分别有k1,k2,k3面,上面的数字1到k1,1到k2,1到k3.每个面出现的概率相同 游戏规则是: 1,有一个计数器,从0开始计数 2.每次摇三个骰子,如果第一个骰子摇到a,第二个骰子摇到b,第三个骰子摇到c,那么计数器归零,否则计数器加上他们三个骰子摇出来的数 3.如果计数器的数字不大于n,那么重复第2步。 问这个游戏结束的期望分析: dp[i]:计数器的数字是i,原创 2017-11-05 00:39:11 · 234 阅读 · 0 评论