DP
keyboarder_zsq
你所认为的极限,其实是别人的起点。
展开
-
HDOJ2955 0/1背包的价值和重量
【hdoj2955】1.概率问题; 计算逃跑率,但是要变成相×的 2.背包处理问题 然后因为率不能作为那个重量,所以价值作为重量,求一个在每个价值下的最大的逃跑率,然后在给定的逃跑率下面,来一个sum作为最大的那个价值,最后倒着for一波sum就行了#include <stdio.h>#include <iostream>#include <sstream>#include <strin原创 2016-04-21 16:42:13 · 463 阅读 · 0 评论 -
HDOJ1864(水的可怜)
注意这句话:精确到小数点后两位如果是小数点的话HDOJ1864#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>double dp[3000050];#include<iomanip>using namespace std;int main(){ int n; double q原创 2016-04-21 16:46:53 · 423 阅读 · 0 评论 -
hdoj2571【DP基础】
题意:中文题/ 思路:DP的思想要理解,就是从上一个最优状态使被传到的状态也是最优状态。因为很久没有打DP,所以连简单地这样的都wa了6次;(QAQ废话不多说)。 题目要求是从(x,y)到(x,y+1)/(x+1,y)/(x,y*k),那么很明显dp[i][j]=max(前面的状态+dp[i][j]),但是你以为就这样而已么? 1.边界问题,在两个边界上,对于(列)j=1那一列,dp[i][j原创 2016-05-31 21:24:10 · 621 阅读 · 2 评论 -
hdoj1024【DP.最 大 m 字 段 和】(写完我都怕。。。不忍直视。。)
弱弱上路,看了好多题解。。。。【A的】 题意就是求最大m子段和。 我们先用a[1e6+7]存入数据; 定义:DP[ i , j ] 为前 j 个元素的 i 个字段的最大和,且第 i 个字段中包含了元素 a[j]。 我们先来看:DP[ i , j ]状态方程由来; 对于一个元素 a[ j ] : ① 他可以自成一段; ②也可以包含第 i 段上,而且是第 i 段上的末尾元素; 那么:原创 2016-07-09 22:38:47 · 577 阅读 · 0 评论 -
hdoj1074【A的无比爆炸】
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,一开始我就不知道怎么写,然后看了题解是状压DP,后来去看了看状压DP也就这样嘛,但是难点,可以说是不熟悉的地方吧。。。如下: 第一、我们能很快的知道状压DP的原理: 就比如我们要考虑一些状态的时候,比如做这题做作业,有N[0 , 15]个作业,我们要表示1,2,3,….,n个作业的状态,我们可以用1/0来表示作业的状态是做完或者没做完。1101 :1号做完,3原创 2016-07-10 11:48:29 · 552 阅读 · 0 评论 -
poj1661【DP,左右两端dp】
/* 【过滤这一段~~~】 一开始想的【错误的,为自己的总结的写的,读者略过】: 每个状态的点肯定是高度,那么我DP每一层,这样的话就有一层循环,其实这无关复杂度,不会很多时间 错误的是想法是从最高层开始DP下来,或者其实这样也同样可行,最高点是固定的。 OK,那么中间呢?怎么考虑一段,我们的目标且只能站在平台上,所以DP每个位置是不现实也是错误的想法。 最终只需要考虑两端?其实对啊,真原创 2016-07-10 18:42:54 · 379 阅读 · 0 评论 -
POJ3186【区间DP】
题意: 每次只能取两端,然后第 i 次取要val[ i ]*i,求一个最大值 先将错觉吧 这道题目一开始想的就是记忆化搜索,然后太天真了?好像是,一开始用一维dp[ i ]直接代表一个点的最大。。。额。。现在想想好撒比,怎么可能一维就可以代表一个点的最大啊。。。因为并不能代表他那一步最大。所以开二维数组dp[ s ] [ e ]代表一个区间上的最大,然后深搜一下就好了。。。 还是菜吧。。原创 2016-07-11 10:24:45 · 487 阅读 · 0 评论 -
poj1015【DP.......无奈了】
首先,读题,真是一窍不通。后来看完程序的意思,才明白吧。。 题意: n个人中选m个,条件是取sum|D-P|最小,当有|D-P|相同的时候取|D+P|最大的。然后输出那些m个人的sumD,sumP,最后升序输出m个人的编号。看完题意,想想好像也不难?。。。瞎想想可能会想出来。 然后看了题解:http://blog.csdn.net/lyy289065406/article/details/66原创 2016-07-12 12:41:48 · 863 阅读 · 0 评论 -
hdoj1260【简单DP】
这题就是一个人买还是两个人买,直接选择一下,而且默认是排好了的,就是DP一下,可能不知道DP的人,也是这么写的吧。DP是一种思想啊。#include <bits/stdc++.h>using namespace std;typedef long long LL;typedef unsigned long long ULL;typedef pair<int, int> PI;typedef原创 2016-07-13 11:32:19 · 380 阅读 · 0 评论 -
POJ2955 区间DP
题意: 都说这题是经典的区间DP,然后没人能把题意说清楚。。。 弱也说不清。。。只能说个大概,在某段区间里面括号匹配数,区间里的括号和外面的括号不能匹配。。。讲着讲着就讲成了区间DP。。。 子区间构成大区间,并且满足最优解特性和无后效性 code…//#include <bits/stdc++.h>#include<cstdio>#include<string.h>#include<m原创 2016-07-24 10:58:36 · 296 阅读 · 0 评论 -
hdoj5115【区间DP·基础】
题意: 有n头wolf排成一排,杀一头wolf回受到受到的伤害=它的本身a[i]+相邻两个b[i-1]+b[i+1].然后杀死第k个位置的wolf的话,k-1和k+1默认相邻(满足的话)。 思路: 用雨巨的话说(完全Orz):这不就变成区间DP水题了么…… dp[i][j]表示从第i头狼到第j头狼全部被杀死所受到的最小伤害。 a[i]表示第i头狼的初始攻击力,b[i]表示第i头狼对相邻狼的原创 2016-07-24 16:51:40 · 414 阅读 · 0 评论 -
lightoj1231【背包】
题意: 有n种货币,已知每种货币的价值和数量。 给出一个k,问最多能组成k的方法。这个数量很大,需要mod 1e8+7. 思路: 额。。。。这一题和上一篇的差不多,直接传送门: (此题很棒) 这里的话就是类似啊: dp[i][j]:前i种硬币组成j有多少种方法。 但是每次要模 code…#include<bits/stdc++.h>//#include<cstdio>//#in原创 2016-07-24 22:06:17 · 685 阅读 · 0 评论 -
lightoj1079【背包】
题意: 哈利波特抢银行。。。 给出n个银行,每个银行有a[i]百万和b[i]的风险。然后再给一个风险值P,不能超过P。 思路: 如果告诉你概率的小数的位数,可能这个就会不一样了。。。 慨率的计算,风险最低和被捕概率; dp[i][j] 为 前i个抢j元的最小被捕概率。 这里可以直接一维做,其实背包很多前i个物品这样子的都可以弄成1维的。因为处理完每次要用的就是i-1的状态,前i-1直接原创 2016-07-24 23:49:34 · 356 阅读 · 0 评论 -
hdoj1028;他们说这题叫dp...
#include<cstdio>#include<string>#include<iostream>#include<vector>#include<queue>#include<stdlib.h>#include<cstring>#include<algorithm>using namespace std;long long dp[40][40];char a[40][40];原创 2016-04-09 00:24:38 · 674 阅读 · 0 评论 -
hdoj2577【多种状态】(简单DP)
#include #include #include #include #include #include#include #include #include using namespace std;//DP,两种状态,lock,notlock的两种状态;int min(int a,int b){ return a}#define原创 2016-02-25 10:08:51 · 377 阅读 · 0 评论 -
hdoj1160【DP】
现在还很弱,贴一个我bin的结题报告日后写到一定会了加油http://www.cnblogs.com/kuangbin/archive/2011/08/04/2127944.html#include <bits/stdc++.h>using namespace std;typedef long long LL;typedef unsigned long long ULL;const doub原创 2016-07-13 23:44:37 · 414 阅读 · 0 评论 -
lightoj1200 【完全背包】
题意: 有一个能放W重的袋子,然后妻子给了老公一列清单,每个item会有价格,数量,重量。 首先得满足老婆的要求,然后在可装的地方输出最大还能拿多少使得拿的东西的钱最多。 注意标题是thief,我想大家也能知道基本上出背包题的人都是心机biao啊…)逃 思路: 1.首先要满足wife的要求是不是。 2.其次再满足husband的小心思。 后面就转化成了完全背包。一开始类似0/1背包直接原创 2016-07-25 10:30:55 · 334 阅读 · 0 评论 -
hdu2476【区间DP,未完待续】
好难搞得东西。。。。 题意都懒得写了,看题解的巨巨莫怪啊,未完待续未完待续,回去睡觉。原创 2016-07-27 00:18:06 · 426 阅读 · 0 评论 -
数字三角形+路径输出
【题目描述】设有一个三角形的数塔,顶点结点称为根结点,每个结点有一个整数数值。从顶点出发,可以向左走,也可以向右走。如图所示:当三角形的数塔给定之后,找出一条从第一层到达底层的路径,使路径的值(路径上的圈内的数字之和)最小。【输入说明】本问题有多组测试数据,第一行就是测试数据的组数,对于每一组测试数据,共有两部分,其中第一部分是一行,即层数L(1<=L<=100),第二部分有L行,每行有L个数字,0原创 2016-07-05 19:11:44 · 2848 阅读 · 2 评论 -
POJ2533/hdoj1950【DP】
O(nlog(n))的方法; 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元素。 d中元素也是单调递增的。#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <se原创 2016-07-06 09:47:12 · 358 阅读 · 0 评论 -
POJ1458【最长公共子序列】
基础DP。#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <algorithm>using namespace原创 2016-07-06 10:06:47 · 521 阅读 · 0 评论 -
hdoj1003【DP】
这道题目的DP,写到现在才明白。。。 每次加或者不加的条件就是这个前面这个子序列合是不是大于等于0,如果不是加了就会让这个位置的值没有意义,如果大于0,他还是在往递增的方向继续前进。 以及这个条件的继续理解:我想用三个例子 )1:5 -1 -2 -3 )2:5 1 -2 )3:5 -1 -2 1 1 可以试着模拟一下,为什么这个判断条件的正确性#include <iostream>#i原创 2016-07-06 08:18:26 · 362 阅读 · 0 评论 -
hdoj1176【DP】
DP基础吧。A掉还是挺爽的。就是考虑在两端只能是从前一秒的内部一米或原来的点来进行,但是在5秒以内可到达点是逐渐外扩的,并不是[0,10],所以就特殊考虑了一下。后面两端是0和10,中间的点可以从上一秒的左边/本身/右边过来,保证每次最优这样下来就好了。#include <iostream>#include <stdio.h>#include <string.h>#include <stack原创 2016-07-06 17:30:28 · 347 阅读 · 0 评论 -
hdoj2859【DP基础】
/*看题解A的。总结:小矩阵--> 大矩阵dp[i][j]=min(t,dp[i-1][j+1]+1); */#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>#include <math.h>#include <queue>#include <原创 2016-07-07 12:48:25 · 336 阅读 · 0 评论 -
poj1338【丑数·DP】
我记得这道题以前写过,而且是写出来了。DP吧。 然后现在想了好久。。。没想出来。。。。 然后考虑一下递推。。mdzz…直接就是让之前的这个每次乘以2,3,5就好了嘛,然后每轮取最小。//#include <bits/stdc++.h>#include<iostream>#include<cstdio>#include<math.h>#include<string.h>#include<原创 2016-07-19 10:28:57 · 442 阅读 · 0 评论 -
POJ3616【基础DP】
//因为同一点结束的时间段会有多个,这里没考虑;//无限wa;const int N=1e6+7;int b[N];LL a[N];LL dp[N];struct asd{ int s; int t; LL w;};asd q[N];bool cmp(asd z,asd x){ if(z.t<x.t) return 1; r原创 2016-07-09 12:42:52 · 411 阅读 · 0 评论 -
Codeforces Round #363 (Div. 2) C. Vacations
题意: 小V的一天有三种状态,去sport,去context,去relax,然后一天呢会有四种情况,0没有gym也没有context,1没有gym有context,2有gym没有context,3有gym有context。 还有一个约束条件就是不能持续的去sport两天,也不能连续持续进行context。 求一个最小的休息时间原创 2016-07-19 23:22:17 · 572 阅读 · 0 评论 -
POJ1276【多重背包】
题意: 给出一个价值sum,然后给出n,代表n个方案,接着n对代表个数与价值,要求最接近sum,但不超过sum的价值。 思路: 多重背包,利用二进制拆分达到保证对于0..n间的每一个整数,均可以用若干个系数的和表示。 贴一发挫code…感受一下//#include <bits/stdc++.h>#include<iostream>#include<string.h>#include<c原创 2016-08-17 23:29:28 · 359 阅读 · 0 评论 -
hdoj2159【二位费用背包】
题意: 略; 推荐看一下那个背包九讲,第五讲非常清晰啊。 原文: 算法 费用加了一维,只需状态也加一维即可。设f[i][v][u]表示前i件物品付出两种代价分别为v和u时可获得的最大价值。状态转移方程就是: f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]} 如前述方法,可以只使用二维的数组:当每件物品只可以取一次时变量v和原创 2016-08-18 00:11:42 · 347 阅读 · 0 评论 -
poj3181【完全背包+整数拆分】
题意: 给你一个数n,在给你一个数K,问你这个n用1-k的数去组合,有多少种组合方式。 思路: 这一看就是完全背包啊。。 写好,交,wa了。。。 可以看到,n=1000,k=100……好大… 后来看了kuangbin爷的仔细讲解,利用了一个整数拆分,利用两个long long的数去组合,得到答案。。。劲啊!#include <iostream>#include <cstdio>#in原创 2016-08-11 10:05:58 · 915 阅读 · 0 评论 -
lightoj1169【DP】
题意(来自大哥): 有两栋楼,左边一栋,右边一栋,层数从1-n,地面的标号为0,每一层有一个水果。有一只猴子在地面上,他现在要上到n层去,在第i层会吃掉水果花费一定时间。 猴子有两种方式从第i层到i+1层,一种是直接往上跳且不花费时间,另一种是花费一定时间到另一栋楼的同一层,然后花费一定时间吃了那层的水果,然后上去且不花费时间; 问猴子到第n层最少时间多少。 在左边每一层吃水果的时间是a[i原创 2016-09-09 10:16:35 · 110 阅读 · 0 评论 -
POJ2063【完全背包】
题意: 给一个初始的钱,年数, 然后给出每个物品的购买价格 与 每年获得的利益, 求在给出的年份后手上有多少钱。 思路: 背包重量还是资金。 dp[0]=初始资金; 重物的重量是他的价格,获利是价值。 这里有n个物品,还有m年的问题,主要的问题是前i年的最大收益,然后在金额的基础上对物品处理 记录每次dp[j]的值作为下一年的收益,然后再for一遍过来 这里还可以将重量进行压缩,原创 2016-08-18 23:48:21 · 643 阅读 · 0 评论 -
POJ 1384【完全背包】
题意: 已知储蓄罐满时的质量f以及空时质量e, 有n种硬币,每种硬币的价值为p,质量为w, 求该储蓄罐中的最少有多少钱? 思路: 完全背包思想,问题是在一个重量下的最小价值 那么只要变一下符号就好了?//#include <bits/stdc++.h>#include<iostream>#include<string.h>#include<cstdio>#include<algo原创 2016-08-18 23:51:34 · 463 阅读 · 0 评论 -
poj1837【背包】
题意: 有一根杆子,给出一些杆子上的位置,位置上能放重物,再给出一些重物的重量。 重物都需要被使用,但是位置不一定都要用到。 问你能有多少种方法让这个杆子平衡。 思路: 额。。。 扯下雨巨:) 雨巨的高中老师说过,DP就是:枚举最后一次决策! 只要最后一次决策涵盖到了所有转移过来的情况,那么就涵盖了所有情况了…… 非常有道理啊。这个和记忆化搜索的思想是一样的,所以都是DP嘛。。mdz原创 2016-07-24 21:01:12 · 652 阅读 · 0 评论 -
POJ2576【背包】
题意: 每个人必须在一个团队或其他; 人对两支球队的数量不得超过1不同; 人们对各队的总重量应尽可能接近相等越好。 思路: 那么我求一个能接近最接近总和一半的值。 每个人的值就是物品,每个物品有且只有一个, 这里有两种重量,一种是体重不得超过一半,另一种是人数不得超过 n/2,应该是(n+1)/2,我们多给前面的部分机会去增大到最靠近总重的一半; 具体还是0/1背包模型,主要还加了一原创 2016-08-18 23:56:41 · 851 阅读 · 0 评论 -
poj3176【简单DP】
其实就是简单递推对吧~ 贴一发记忆化搜索的…#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <algorithm原创 2016-08-08 15:38:26 · 472 阅读 · 0 评论 -
Codeforces711C 【DP】
题意: 有n个点,m种颜色,你要给n个点上没有颜色的点染色。每个点i对应染的颜色j有一个颜料消耗,p[i][j]是点i染成j颜色的花费,你必须保证有k段颜色的点,输出最少花费多少颜料。 还有一个就是本身有颜色不能变。。。 思路: dp[i][j][k] := 前i个树,第i个树染j颜色,构成k段的最小花费 #include<cstdio>#include <map>#include<io原创 2016-08-30 00:26:35 · 875 阅读 · 0 评论 -
poj2229【完全背包-规律Orz...】
挑战DP 题意: 被组合数只能是2的整数幂,然后给出一个数问有多少种组合(mod1e10); 思路: 完全背包做啊…还是蛮简单的…(这里取膜要改成加法,省时间…) dp[i]代表对于j的方案数贴一发吧…#include <iostream>#include <cstdio>#include <string.h>#include <stack>#include <queue>#in原创 2016-08-08 17:42:35 · 892 阅读 · 0 评论 -
CodeForces 13C【DP】
题意: 给你n个数,每次只能让一个数+1,或者-1,目标是最终使这个序列构成一个非递减的序列; n是5e3,复杂度n^2内。值是1e9; 思路: 可以发现子结构是保证一个区间的非递减, 如果只是dp[a][b]代表在[a,b]上需要的最小步数,这样很难处理a,b位置的值,且不构成递推性; 所以可以在递推中(前i个)去dp以 j 值为末端的区间需要的最小步数。 dp[i][j]=min(原创 2016-08-19 22:36:42 · 488 阅读 · 0 评论 -
POJ 2392【多重背包】
题意: k个块,给出每个块的高度hi,数量ci,不能超过的高度; 求这些块可以组成的最大高度一个。 思路: 大致可看这个题是一个背包,背包的价值是高度,背包的承重是高度。 对于每个物品,有他的价值是高度,还有限定的数量,看到这里就是一个多重背包, 然后对于每个物品还有一个限制是对于他的特定高度,这种怎么处理其实很简单吧。 dp[]应该是一个存一个高度; wa了一发,没有考虑一维的时候原创 2016-08-19 22:40:22 · 757 阅读 · 0 评论