dp
人菜瘾大aaabbbb
这个作者很懒,什么都没留下…
展开
-
dp中一些的基础问题
能用动规解决的问题的特点1)问题具有最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质。2)无后效性。当前的若干个状态值一旦确定,则此后过程的演变就只和这若干个状态的值有关,和之前是采取哪种手段或经过哪条路径演变到当前的这若干个状态,没有关系。什么是无后效性,看到一个很好懂的解释;(转)某阶段的状态一旦确定,则此后过程的演变不再受此前各种...原创 2018-09-26 21:10:36 · 1245 阅读 · 0 评论 -
kuangbin基础dp POJ - 3186 // (区间dp//记忆化搜索)
题意:给一个数组v,每次可以取前面的或者后面的,第k次取的v[i]价值为v[i]*k,问总价值最大是多少。 思路:dp[i][j]代表从i-j的区间,先取i或者先取j得到的最大值记忆化搜索代码:#include<iostream>#include<cmath>using namespace std;int dp[2010][2010],v[201...原创 2019-02-27 15:42:13 · 201 阅读 · 0 评论 -
洛谷P1757 通天之分组背包 //分组背包
分组背包裸体分组背包和普通01背包的区别就是分组背包最外层为枚举的是组数(01背包是物品数),然后在最内层枚举的是枚举各组中物品的序号,这样每个体积下,每种物品只会选择一个价值最大的。idx数组是将最组中每个物品的序号记录下来。#include<iostream>#include<bits/stdc++.h>using namespace std;int d...原创 2019-02-12 10:37:13 · 440 阅读 · 0 评论 -
洛谷P1352 没有上司的舞会 //经典树形dp
题意:给一棵树每个节点给定一个价值,子节点和父节点不能同时选取,求能够选取的最大价值。用dp[u][0]表示不选取u节点的u子树(包括u在内)能获得的最大价值,dp[u][1]表示选取u节点的u子树(包括u在内)能获得的最大价值。#include<bits/stdc++.h>using namespace std;int dp[10001][2],r[10010],vis...原创 2019-02-12 20:28:12 · 171 阅读 · 0 评论 -
HDU- 2089 不要62 // 经典数位dp
题意:计算出区间n-m中不包括62和4的数字的个数思路:记忆化搜索实现数位dp;记忆化重复的部分,记忆的是例如,1-3333中,1000-1999第一次已经计算过,那么2000-2999中的个数应该和1000和-1999中是一样的,这样可以直接记忆,但是3开头的部分3000-3333是有限制的部分,所以不能直接记忆#include<bits/stdc++.h>...原创 2019-02-19 10:55:47 · 168 阅读 · 0 评论 -
洛谷P1064 金明的预算方案 //有依赖的背包问题
带有附件的背包问题,它属于01背包的变式思路解法一:转化为四种情况的分组背包求解// luogu-judger-enable-o2#include<iostream>using namespace std;int cnt[100],num1v[100],num1c[100],num2v[100][3],num2c[100][3],dp[100010];int ma...原创 2019-02-14 15:35:04 · 209 阅读 · 1 评论 -
kuangbin基础dp HDU - 1069 (最长有序子序列变形)
题意:给出一些长方体,然后让你把他堆成塔,要求下面的塔的要比上面的塔大(长和宽),而且每一种长方体的数量都是无限的。思路: 将长方体的6种长款高都提取出来保存到结构体种,按照长度优先相等的按照宽度排序,得到的序列跑一个最长下降子序列就出来了,dp[i]代表第i个塔为最上层塔,当这个塔为止的塔的最大高度。#include<iostream>#include<al...原创 2019-02-26 11:17:56 · 183 阅读 · 0 评论 -
Codeforces 538 (Div. 2) D. Flood Fill(区间DP)
题意:可以将连续的色号变成另一种色号,问将所有色号变成一种色号,所需要的操作次数思路:区间dp,注意状态转移时的无后效性#include<iostream>#include<cstring>using namespace std;const int inf=0x3f3f3f3f;int a[100010],dp[5005][5005][2];in...原创 2019-02-21 11:09:04 · 130 阅读 · 0 评论 -
kuangbin基础dp HDU - 1160 // 最长上升子序列+记录路径
题意:输入中每行有两个正整数,分别表示老鼠的体重和速度,范围均在1到10000之间,输入数据最多有1000只老鼠。我们是要在原来的老鼠序列中,找到一个最长的子序列,使得这个子序列中老鼠的体重在严格增加,速度却在严格降低。思路:按照体重排序后,对速度跑一个最长上升子序列,dp形式的,方便记录路径,这里的记录路径和链式前向星原理比较像,在dp时记录最后更新这个节点的前一个节点的序号,dp完...原创 2019-02-27 09:43:43 · 232 阅读 · 0 评论 -
UVa348 最优矩阵链乘 (记忆化搜搜&&dp&&输出路径)
最优矩阵链乘:一个n*m的矩阵由n行m列共n*m排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个n*m的矩阵乘m*p的矩阵,运算量为n*m*p。矩阵乘法不满足分配律,但满足结合律。因此A*B*C既可以按顺序(A*B)C也可以按A(B*C)来进行。假设A、B、C分别是2*3、3*4、4*5的,则(A*B)C运算量是2*3*4+2*4*5=64,A(B*C)的运算量是3*4...原创 2019-03-07 20:01:52 · 167 阅读 · 0 评论 -
kuangbin基础dp HDU-1024 (m个不相交子段和最大值)
#include<iostream>#include<cstring>using namespace std;int maxx[1000100],dp[1000100],a[1000100];int main(){ int n,m; while(cin>>m>>n){ memset(dp,0,sizeof(...原创 2019-03-17 20:02:35 · 216 阅读 · 0 评论 -
Gym - 101982C 方案数dp
题意:给你n个题目,让你从中选取k个题目来生成一场比赛,每个题目有一个难度等级,一场比赛中题目的难度等级不能重复,让你求方案数。思路:#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=998244353;int a[1010];ll dp[1010][1010...原创 2019-07-24 11:32:47 · 217 阅读 · 0 评论 -
2019 ICPC沈阳网络赛 C Dawn-K's water(完全背包)
题意:有n种矿泉水,给出你每种矿泉水的价格和水量,现在给你一个m,让你求水量不少于m所花的最小价值,如果最小价值相同,则输出他可以获得的最大重量。每种水可以买多次。思路:完全背包枚举一下所有物品就好了,当时比赛错在背包的容量开小了,2*m是不够的,可能一个物品的重量就超过m了,所以要以数据范围为背包大小。#include<bits/stdc++.h>using n...原创 2019-09-23 20:24:23 · 284 阅读 · 0 评论 -
Comet OJ - Contest #11Business (背包dp,dp最终化问题)
题意:你要计算如下模型能得到的最大钱数:有n天,初始时你的钱数为0,有m种可能操作,第 i种会使你当前失去ai的钱数并在n天结束后返还 bi的钱数。每一天可以执行任意多种操作,每种任意次(但每次操作后你的钱数不能为负)。每天结束时你会获得一个与当前持有钱数x相关的收入f(x) ,而f(x) 单调不增。思路:dp最终化问题,背包dpdp[ i ...原创 2019-09-25 20:40:45 · 107 阅读 · 0 评论 -
洛谷p1776宝物筛选 //多重背包二进制优化
裸多重背包二进制优化 #include<iostream>#include<cstring>using namespace std;typedef long long ll;ll vv[1000005],ww[1000005],mm[1000005],dp[1000005];ll val[1000005],sizev[1000005];int main()...原创 2019-02-11 11:28:11 · 357 阅读 · 0 评论 -
牛客练习赛39 B 选点 // dfs序+LIS
因为根节点的权值最小,其次是右子树的点,最后是左子树的点,所以按照先根,再右子树,再左子树的顺序dfs整棵树,求出dfs序,在dfs序上求最长上升子序列。复杂度O(nlogn)dfs序+LIS#include<iostream>#include<algorithm>using namespace std;typedef long long ll;int...原创 2019-02-16 19:09:17 · 154 阅读 · 0 评论 -
ACM-ICPC 2018北京赛区网络预赛B (二进制枚举&最长公共子序列)&(set求交集)
#include<iostream>#include<cstring>#include<map>using namespace std;int n;char s1[20],s2[20],s3[20],a[20][20],ans[20],aa[20],bb[20];int dp[20][20],c[20],len[20];void initi...原创 2018-09-27 10:58:49 · 205 阅读 · 0 评论 -
NAIPC2016 F (计数dp)
dp好弱鸭。。这个题目关键在于递推方程,这个递推方程怎么得到的呢?dp[i][j]代表第行,放j个绸缎可以放的的方法数,三个for循环分别控制,第一个for控制在前i列放绸缎,j控制在这前i列放单位绸缎的个数,放绸缎的个数不超过长*宽,所以用当j+k>n break。k控制在一列中放绸缎的数量,放绸缎的数量不超k个。再分析一下dp方程,dp[i][j+k]=dp[i][j+k]...原创 2018-10-06 20:14:12 · 269 阅读 · 0 评论 -
Codeforces 789C - Functions again 最长公共子段和&dp
题意 :#include<iostream>#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a[100010],dp[100010],dpp[100010];int main(){ int n; cin>>n; for(int i=0;i...原创 2019-01-17 14:51:03 · 123 阅读 · 0 评论 -
浅析记忆化搜索与dp的基本思想
看了一些博客,总结出了记忆搜索和dp之间的一些关系对于01背包这种类型的对于每个物品有选或者不选择两种状态的问题,我们先从暴搜入手思考这个问题例如洛谷p1048int n,t;int tcost[103],mget[103];int ans = 0;void dfs( int pos , int tleft , int tans ){ if( tleft < 0 ...原创 2019-01-24 13:34:29 · 888 阅读 · 2 评论 -
Educational Codeforces Round 57 D. Easy Problem 字符串dp
题意:给一个长度为n的字符串,删除字符串中的一些字母使得字符串中不能出现子序列hard,删除每个字母都有一个花费值,输出删除结束后的最小花费值之和。#include<iostream>#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=998244353;l...原创 2019-01-15 15:32:39 · 161 阅读 · 0 评论 -
Codeforces Round #240 (Div. 1) B. Mashmokh and ACM(dp&排列组合)
题意:输入两个数n和k,从1-n这个数中选择不超过k个数组成一个序列,每个数可以选多次,组成的序列每个数可以整除前一位数,问可以组成多少个这种序列。#include<bits/stdc++.h>using namespace std;const long long mod=1e9+7;int dp[2010][2010];int main(){ int n,k;...原创 2019-01-15 19:33:36 · 126 阅读 · 0 评论 -
Codeforces 1005D - Polycarp and Div 3 (同余贪心||dp)
同余的思想进行贪心 #include<iostream>#include<bits/stdc++.h>using namespace std;char s[200010];int main(){ cin>>s+1; int d=strlen(s+1); int flag=0,cnt=0; int sum=0; ...原创 2019-01-24 09:55:33 · 180 阅读 · 0 评论 -
Codeforces 166E - Tetrahedron dp
题意:从D点出发,输入一个n,代表行走的步数,每一步可以从一个点到达另一个点,计算走n步回到D点放法数。例如n等于2时D - A - D D - B - D D - C - D分析:这个dp主要是要找到dp[i][j],这里的dp[i][j]代表是走到第i步时经过第j个点时的方法数,所以这里的j用0123代表点ABCD,最后只要输出dp[n][3]就是答案。那这个转移方程就是if...原创 2019-01-16 16:30:17 · 432 阅读 · 3 评论 -
light OJ-1011记忆化搜索+状态压缩||状压DP
#include<iostream>#include<cstring>using namespace std;int dp[1000010],a[500][500];int n;int dfs(int x,int nn){// cout<<x<<n<<endl; if(nn==0)return 0; if...原创 2019-01-22 20:13:41 · 133 阅读 · 0 评论 -
洛谷P2014 选课 // 树形dp&&树形背包
题意:在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b)。一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少?思路:#include<bits/...原创 2019-02-14 20:04:13 · 213 阅读 · 0 评论 -
石子合并 // 直线型&&环形合并 // 区间dp
直线型合并#include<iostream>using namespace std;int num[110],sum[110][110],dp[110][110],sss[110];int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>num[i]...原创 2019-02-15 19:14:55 · 118 阅读 · 0 评论 -
牛客练习赛39 C // 概率dp
题意:现在一共有n天,第i天如果有流星雨的话,会有wi第i天有流星雨的概率是pi如果第一天有流星雨了,那么第二天有流星雨的可能性是p2+P第i−1 (i≥2)天有流星雨,第i天有流星雨的可能性是pi+P,否则是pi。求n天后,流星雨颗数的期望。解法:设Ti 为第i天下雨的真正概率,由于第i天的概率只与第i-1天有关,所以有Ti=Ti−1×(pi+P)+(1−Ti−1)×p...原创 2019-02-16 14:21:02 · 164 阅读 · 0 评论 -
2019牛客暑期多校训练营(第四场)K.number (dp)
题意:给你一个字符串,求他有多少个子串是300的倍数思路:O(300n)的dp#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;int dp[maxn][310];typedef long long ll;int main(){ char s[maxn];scanf("...原创 2019-10-03 15:10:59 · 110 阅读 · 0 评论