![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
Jiahe Xu
为何要去攀登珠穆朗玛峰,因为她就在那里啊.
展开
-
usaco buylow dp+记录路径
/*ID: xujiahe1PROG: buylowLANG: C++*/#include#include#includeusing namespace std;#define MAXN 100005#define INF 0x3f3f3f3fint a[MAXN],dp[MAXN],r[MAXN],n;int main(){ freopen("buylow.in原创 2014-08-25 19:39:24 · 547 阅读 · 0 评论 -
bzoj1096: [ZJOI2007]仓库建设 斜率优化DP
纠结的公式推导。。。g[原创 2014-07-22 14:57:41 · 595 阅读 · 0 评论 -
voj1218 环形dp 记忆化搜索
#include #include #include #include #include using namespace std;#define ll long longint save[1000],n,m;ll sum[1000];ll dp[120][120][20],dp2[120][120][20];ll dfs(int l,int r,int k){ //p原创 2014-08-06 10:11:51 · 454 阅读 · 0 评论 -
poj3172 搜索01背包
#include #include #include #include #include using namespace std;long long w[1100],c,ans,sum[1100];int n;void dfs(int order,long long left){ if(left<=0) return; if(order==1)原创 2014-08-18 09:53:21 · 736 阅读 · 0 评论 -
UVALive 5790 Ball Stacking dp
dp[j]代表到第j列所能取到的最大值,maxm记录原创 2014-09-02 16:28:04 · 777 阅读 · 0 评论 -
hdu4576 Robot 滚动数组
直接暴力#include #include #include #include double dp[205][2];int main(){ int n,m,l,r; while(scanf("%d%d%d%d",&n,&m,&l,&r)!=EOF) { if(n+m+l+r==0)break; memset(dp,0,sizeof原创 2014-10-05 11:50:57 · 547 阅读 · 0 评论 -
hdu1003 Max Sum
#include #include #include #include #include using namespace std;int times;int n,a[110000],start[110000],f[110000];void init(){ memset(a,0,sizeof(a)); memset(start,0,sizeof(start));原创 2014-07-15 19:56:23 · 423 阅读 · 0 评论 -
poj2486 Apple Tree 树形dp好题
由于之前的树形dp只是单向性原创 2014-11-04 16:54:49 · 479 阅读 · 0 评论 -
codevs2189 数字三角形W dp
由于mod值不好判断大小,原创 2014-11-04 19:17:14 · 737 阅读 · 0 评论 -
bzoj1296: [SCOI2009]粉刷匠 DP
其实题意很坑爹,T有可能大于n*m原创 2014-07-04 19:29:08 · 793 阅读 · 0 评论 -
bzoj1207: [HNOI2004]打鼹鼠 暴搜
简单dp,只是看到数据范围原创 2014-07-22 16:54:44 · 882 阅读 · 0 评论 -
POJ3666 Making the Grade [DP,离散化]
#include #include #include #include #include #include using namespace std;#define maxn 3000#define ll long longll dp[maxn][maxn];int a[maxn],b[maxn],n;void solve(){ ll minn; for(in原创 2014-08-28 18:26:13 · 616 阅读 · 0 评论 -
hdu1227 DP
cost 记录两个车站之间只有一个仓库时的最小距离原创 2014-07-28 15:27:23 · 575 阅读 · 0 评论 -
bzoj3156: 防御准备 斜率优化DP
斜率优化dp,直接推公式。其实斜率优化dp除了原创 2014-07-22 11:29:14 · 568 阅读 · 0 评论 -
bzoj1911: [Apio2010]特别行动队 斜率优化DP
斜率优化dp,推公式就可以了。原创 2014-07-22 11:27:03 · 544 阅读 · 0 评论 -
hdu1511 LCS
蒟蒻的自我拯救。。。#include #include using namespace std;char num[85];int dp[85], n;bool judge(int st1,int len1,int st2,int len2){ while (num[st1] == '0' && len1) st1++, len1--; while (num[st2] =原创 2014-08-01 10:43:24 · 545 阅读 · 0 评论 -
1996: [Hnoi2010]chorus 合唱队 DP
区间dp,dp[ i ] [ j ] [ 0 ]原创 2014-07-26 16:37:41 · 589 阅读 · 0 评论 -
bzoj1046上升序列 DP+记录路径
反向dp 打印的时候直接扫一遍就可以了。#include #include #include #include using namespace std;#define maxn 11000int a[maxn],n,cnt,p,len,x,b[maxn],f[maxn],maxl,m;inline int getpos(int k,int l,int r){ if(l==r原创 2014-07-26 15:50:38 · 510 阅读 · 0 评论 -
bzoj1010: [HNOI2008]玩具装箱toy 斜率优化DP
#include #include #include #include #include using namespace std;#define maxn 510000#define ll long longll f[maxn],sum[maxn],q[maxn],x[maxn];ll m,n,h,t,L;ll M(ll k) {return k*k;}double getk原创 2014-07-21 18:39:31 · 502 阅读 · 0 评论 -
bzoj1003 [ZJOI2006]物流运输trans
本题为dp和最短路的结合,cost(X,Y)原创 2014-06-05 20:11:26 · 1598 阅读 · 0 评论 -
codevs2102 石子归并 2
那年还是孩子的我一位有多难,现在原创 2014-11-06 15:56:43 · 506 阅读 · 0 评论 -
codevs3012 线段覆盖 4 dp好题
第一次看到这个题目首先想到的就是dp。然后发现原创 2014-11-07 09:18:11 · 811 阅读 · 0 评论 -
hdu5890 bitset优化dp
题目大意:给50张以内的牌,每次取走三张以内的牌,问在剩下的牌里抽10张是否能组成87. 询问有10w次题解:提前打表,用bitset优化背包转移。bitset的复杂度应该是O(n)/一个常数 #include #include #include #include #include using namespace std;bitsetdp[11];int ans[60][60原创 2016-09-18 06:57:47 · 575 阅读 · 0 评论 -
codeforces 713C dp+离散
题意:给你一个整数序列,可以给一个数+1或-1 代价都是1 问最少操作多少次使序列严格递增。题解:dp+离散 类似于poj3666 只不过原序列a[i]=a[i]-i然而感觉最终每个数都是原序列中的数,这个结论感觉好魔幻。。。。。。然后YY了一个比较有道理的推论方法:假如当前序列到i都是递增的 在第i~j个数不再递增,那么第i~j最优整合方案就是向i~j的中位数靠拢,由于中位数一定是原原创 2016-10-31 21:13:15 · 1054 阅读 · 0 评论 -
hdu5845 Best Division (xor-trie+dp)
题意:给定一段数列,将其划分成最多的段 并且每段长度不超过 L且异或和不超过 X有一个很显然的 O(N2)的dp做法 dp[i]表示到 i为止最多能分成多少段 然后从前面最多 L个 dp值转移出来 但是对前面 L个 dp可以用 xor-trie维护一下 这样一来时间复杂度就是 O(Nlog(A))每次将当前位置的前缀异或和插入trie, 并且在叶子节原创 2017-02-08 18:44:53 · 405 阅读 · 0 评论 -
hdu5781 ATM Mechine 概率dp
题意: 有不超过k元钱,若取钱大于剩余,atm会报错,问在不超过w次报错下,取出所有钱的最小期望。题解: 设当前状态dp[i][j],i为最大钱数,j为剩余报错数, 若i > 0、 j > 0, 则dp[i][j] = minik=1(i−k+1i+1∗dp[i−k][j]+ki+1∗dp[k−1][j−1]+1), 前一项为k不超过剩余的情况,后一项为超过,1为当前操原创 2017-03-05 18:58:48 · 440 阅读 · 0 评论 -
hdu5773 The All-purpose Zero 贪心+最长上升子序列
题目大意:可以将0替换成任意interger(包括负数),在此基础上求最长递增子序列。解题思路:无疑LIS,将所有的0全部提取出来,求出此时序列的LIS(不含0的),这是针对0在子序列的外面的情况,如0,1,2,3,0.那么如果0在子序列中间怎么办?很简单,把读入的非0的数的值减去这个数前面0的个数即可,如1,2,0,3,4。在提取出0后序列其实为1原创 2017-03-05 19:02:15 · 424 阅读 · 0 评论 -
hdu5760 Palindrome Bo 经典dp
Description 给出n个数,要找到一个合法的最长子序列s,输出其长度,并且输出不同的s的个数。s序列必须是回文的,并且中间最小,往两边依次不减。s1与s2不同当且仅当长度不同或者存在某位s1[i]!=s2[i] Input 多组用例,每组用例首先输入序列长度n,之后输入n个整数ai表示该序列,以文件尾结束输入(1Output 对于每组用例,输出两个整数,第一个表示最长的原创 2017-03-05 19:13:26 · 400 阅读 · 0 评论 -
codeforces 791D 树形dp 所有点对
题意:20w个点的树,边长都为1,每个点可以往距离不超过k题解:树形dp,A#include using namespace std;typedef long long int ll;ll dp[250000][5];vectorg[250000];int k;ll dists[220000],ans,sons[220000];void dfs(int x,int fa){原创 2017-03-24 21:28:15 · 686 阅读 · 0 评论 -
zoj3966 Domino Tiling dp
题目大意:给你一个n*m的棋盘 你只能用1x2的格子拼接 且不能同时有4个不同格子的角汇聚在同一处。200组左右的输入 输出任意方案。题解:由于限制条件太强所以最优方法是确定的 首先假设n#include using namespace std;#define orz printf("orz\n");#define pf printf#define ss system("pause")原创 2017-05-09 18:27:30 · 895 阅读 · 0 评论 -
hdu 5834 Magic boy Bi Luo with his excited tree 树形dp
题目大意:给定一个树。给个点有一个值,每个边也有一个值,经过点可以得到点的值(只能拿一次),边每次经过都要减去边的值。可以理解为点有钱,经过边要交路费,问从每个点开始,得到的值最大是多少。题解:PS(感觉像是一道以前CF的题,但是找了很久也没有找到) 由于要输出每一个点,所以很自然地想到树形dp。我们可以先以1为root,以f[i][0]表示在i的子树下返回i所能得到的最大值,以f[i][原创 2016-08-15 13:07:32 · 402 阅读 · 0 评论 -
hdu5887 Herbs Gathering 搜索01背包
题目大意:01背包,但花费和价值都是10w 可是商品只有100个题解:搜索01背包,对花费进行排序,记下前缀和,然后搜索时强剪枝就好了。PS:这题改编自一个usaco的原题 http://blog.csdn.net/eod_realize/article/details/38656021 #include #include #include #include #include原创 2016-09-18 09:00:30 · 924 阅读 · 0 评论 -
706C. Hard problem
题目很明显有无后向性 所以直接dp[i][j] j=0 or 1 代表第i个串翻转没有 字符串比较可以直接用string 由于太简单就不贴码了原创 2016-08-13 15:00:41 · 302 阅读 · 0 评论 -
bzoj1009: [HNOI2008]GT考试 矩阵乘法
大概是f[i][j]表示前i个匹配到串第j个的方案然后你需要把一个答案矩阵f[i][j]转移到f[i+1][j]举个例子,样例,比如当前匹配到了第2位,也就是说前i位结尾是11对于i+1这个字符,如果还是1的话就能匹配到第3位,不是1的话就只能匹配到0了也就是说前i位你匹配到了j位,加入一个i+1字符,根据i+1的不同情况,有一些会转移到j+1,一些会转移到其他的,原创 2014-12-15 23:44:48 · 766 阅读 · 0 评论 -
bzoj1131: [POI2008]Sta 树形dp
记录下当前节点的儿子个数,再记下以当前节点为跟的所有子节点的深度之和。val[I]表示以i为根的所有深度和。val[now]=val[last]-f[now]+n-f[now];#include #include #include #include #include using namespace std;typedef long long sint;#define maxn 2原创 2014-12-19 00:51:19 · 652 阅读 · 0 评论 -
bzoj3107: [cqoi2013]二进制a+b DP
DPf[i][a][b][c][j]当前枚举到(二进制下的)第i位,a' b' c'各用a,b,c了几个1,j表示最后一位是否有进位这时的最小答案/数组要开大一点。。。。。。#include #include #include #include #include using namespace std;long long f[40][40][40][40][2];bo原创 2014-12-21 21:11:06 · 1413 阅读 · 0 评论 -
bzoj1019: [SHOI2008]汉诺塔 dp
根据操作方式,易知对给定任意状态->题中目标状态的操作序列均是唯一的.所以想到递推.结合汉诺塔&&BLAH,可想到递推方程: f[x][i] ,g[x][i] 分别表示,当前x柱上有i个圆盘,将它们移至任意另一个柱的操作数,和另一柱子的编号.(如上,这显然对任意连续的i个圆盘,都是唯一固定的)f[x][i],g[x][i] 可由 f[][i-1],g[][i-1] 推得:汉诺塔的经典转原创 2014-12-10 23:26:54 · 979 阅读 · 0 评论 -
bzoj1831: [AHOI2008]逆序对 DP
这套题里面就这个题没有一次A掉。。。40分还是不错的。文章转自ZYF-ZYF 这些填的数应该有什么性质---一列数能有什么性质?大概就是递增递减吧。。。 (吐槽:这思路也太牵强了吧。。。回答:。。。。。。) 下面我们考虑两个空 a,b ,分别填上了x,y (假设只有两个空,并且x>y) 如果我们交换 x 和转载 2014-12-14 21:51:31 · 1089 阅读 · 0 评论 -
bzoj1026: [SCOI2009]windy数 数位dp
第一次接触数位系统,感觉还是很神奇的。f[I][J]代表一个i位数顶位为j的windy数有多少个。我们可以用work(n)来计算n以内所有windy数的个数。那么答案就是work(b)-work(a-1);由于没有位数限制work(n)中要把所有位数小的windy数个数加上去。在枚举每一位的时候如果不是个位的话,当前枚举到得值要比n这个数的这一位小,为了避免原创 2015-01-04 21:05:47 · 548 阅读 · 0 评论 -
bzoj2216: [Poi2011]Lightning Conductor 决策单调性
这是一个非常经典的模型了,1D1D的动态规划这类问题最基础的是斜率优化。难一点的就很麻烦了……什么用平衡树维护凸包之类的。不过我完全不会这题是我见到的第一道非斜率优化的1D1D了……p=F[i]=max{a[j]+sqrt(abs(i-j))}-a[i]注意到函数f(x)=sqrt(x)-sqrt(x-1)单调递减,所以若k然后可以yy出很多东西比如对于i,最优解是i的原创 2015-03-06 18:45:14 · 758 阅读 · 0 评论