dp基础大概 (8.6)】的更多相关文章

一些前言: 据说动态规划会用排序,数据结构来进行乱搞优化操作 动态规划滴核心是个啥呢?状态表示和状态转移 设状态:哪些因素会影响到最终答案,就把哪些因素用数组的维度表示出来 要充分描述,也要简洁 举个例子 计算从(1,1)走到(x,y)的方案数: 走到任意一个(p,q),只能从(p-1,q)和(p,q-1)走过来 那dp[x][y]=dp[x-1][y]+dp[x][y-1] 例一: 最长上升子序列 这个比较简单 dp[i]表示以a[i]为结尾的最长上升子序列的长度 dp[i]=max{dp[j…
知识储备:dp入门. 好了,完成了dp入门,我们可以做一些稍微不是那么裸的题了. ------------------------------------------------------------------------------------ 洛谷P1880 石子合并 分析:曾经的noi系列.石子合并问题分好几种情况. 这题是环形的,且只能合并相邻的两堆,那么我们把石子数组展开,如[1,2,3,4,5] -> [1,2,3,4,5,1,2,3,4,5],这样进行处理,就能将环形转换成直线…
知识储备:dp入门. 好了,完成了dp入门,我们可以做一些稍微不是那么裸的题了. dp基础,主要是做题,只有练习才能彻底掌握. 洛谷P1417 烹调方案 分析:由于时间的先后会对结果有影响,所以c[i]*b[j]>c[j]*b[i]为条件排序,然后再01背包. 洛谷P1387 最大正方形 分析:用dp[i][j]来表示以a[i][j](正方形数组)为右下角最后一个数的正方形边长,a数组可以直接用dp数组代替掉. #include <cstdio> #include <algorit…
不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 58665    Accepted Submission(s): 23095 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可…
We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regular brackets sequence, if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and if a and b are regular brackets…
DP基础(线性DP)总结 前言:虽然确实有点基础......但凡事得脚踏实地地做,基础不牢,地动山摇,,,嗯! LIS(最长上升子序列) dp方程:dp[i]=max{dp[j]+1,a[j]<=a[i]} 复杂度:O(n^2) LIS优化 法一:数据结构无脑暴力优化 ​ 以a[i]为数组下标,从1到a[i]访问最大值,再加一,进行更新 法二:设h[k]表示dp值为k的最长上升子序列的最小值(有点贪心在里面) ​ 显然h[k]>=h[k-1](k>=2),证明:若存在h[k-1]>…
今天来给大家讲一下数形dp基础 树形dp常与树上问题(lca.直径.重心)结合起来 而这里只讲最最基础的树上dp 1.选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有 N 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a才能学习课程b).一个学生要从这些课程里选择 M 门课程学习,问他能获得的最大学分是多少? 思路: 我们可以把…
比基础的多一点东西的背包问题. 链接:POJ2642 大意:有N种砖,每种花费p[i],含铜量c[i],现需要用M种不同的砖融成含铜量在Cmin到Cmax之间(可等于)的砖,即这M种砖的含铜量平均值在这个范围内,求最小花费.(M.Cmin.Cmax有多种需求,分别输出花费) 题解: DP, f[i][j]表示选i种砖,含铜量的和为j时的最小花费.这样在询问M.Cmin.Cmax之前,先将各种砖数.组成各种含铜量的花费都算好. DP方程:f[k][j]=min(f[k][j],f[k-1][j-c…
1.UVA103 嵌套n维空间 DAG模型记忆化搜索,或者 最长上升子序列. 2.dp[i]=max( dp[j]+1),(第i个小于第j个) (1) //DAG模型记忆化搜索 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define F(i,a,b) for (int i=a;i<b;i++) #define F…
The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4859    Accepted Submission(s): 2864 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝…
链接:Piggy-Bank 大意:已知一只猪存钱罐空的时候的重量.现在的重量,已知若干种钱的重量和价值,猪里面装着若干钱若干份,求猪中的钱的价值最小值. 题解: DP,完全背包. g[j]表示组成重量j的最小花费 g[j]=min(g[j],g[j-w[i]]+v[i]) 完全背包物品可以多次使用,所以j的循环要正着来. 代码: #include<cstdio> #include<cmath> #include<iostream> #include<cstring…
题意:容易理解. 分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理.先算出每行能够能够得到的最大值,然后按列处理即可. 代码实现: #include<stdio.h> #include<string.h> int n,m; ],dp[][],b[]; int max(int x,int y) { return x>y?x:y; } int main() { int i,j,res; while(scanf("%d%d",&n,&a…
Description The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard bowling-pin-like triangle like this: Then the other cows traverse the triangle starting from its…
取血怒.first blood,第一区间DP,这样第一次没有以某种方式在不知不觉中下降~~~ 题目尽管是鸟语.但还是非常赤裸裸的告诉我们要求最大的括号匹配数.DP走起~ dp[i][j]表示区间[i,j]的最大匹配数.那么最重要的状态转移方程就是: dp[i][j]=max(dp[i][k]+dp[k+1][j]) 对啦,要先初始化边界啊.两步走~: memset(dp,0,sizeof dp); if str[i]==str[i+1]   则:dp[i][i+1]=2       请看----…
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格.   1 3 3 2 1 3 2 2 1   能够获得的最大价值为:11. Input 第1行:N,N为矩阵的大小.(2 <= N <= 500) 第2 - N + 1行:每行N个数,中间用空格隔开,对应格子中奖励的价值.(1 <= N…
/* dp[i][0|1|2]:没有49的个数|最高位是9,没有49的个数|有49的个数 dp[i][0]=10*dp[i-1][0]-dp[i-1][1] dp[i][1]=dp[i-1][0] dp[i][2]=10*dp[i-1][2]+dp[i-1][1] */ #include<bits/stdc++.h> using namespace std; #define ll long long ll dp[][],n,t; void init(){ dp[][]=; ;i<=;i+…
数塔 Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内. Output 对于每个测试实例,输出可能得到的最大和,每个实例的输出占…
最简单的那类区间dp,昨天晚上心态不对,不知道在打什么.. /* dp[l][r]表示区间[l,r]都涂成同色的代价 dp[l][r]可以由dp[l][r-1],dp[l+1][r],dp[l+1][r-1]转移得到 */ #include<bits/stdc++.h> using namespace std; #define maxn 5005 int dp[maxn][maxn]; int n,color[maxn]; int main(){ cin>>n; ;i<=n;…
/* 给定n头牛,m个谷仓,每头牛只能在一些特定的谷仓,一个谷仓只能有一头牛 问可行的安排方式 dp[i][j]表示前i头牛组成状态j的方案数,状态0表示无牛,1表示有牛 使用滚动数组即可 枚举到第i头牛时,状态j必须有i-1头牛,然后由这个状态推导出第i头牛的状态,再清0 */ #include<iostream> #include<cstring> using namespace std; ][],dp[<<],tmp; int main(){ while(cin&…
/* dp[S]表示状态S下的最大收益,0表示没有了,1表示还在 */ #include<bits/stdc++.h> using namespace std; <<],mp[][],n; int main(){ while(cin>>n && n){ ;i<=n;i++) ;j<=n;j++)cin>>mp[i][j]; memset(dp,,sizeof dp); ; <<n)-;S>=;S--) ;i<…
#include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; ][],flag[],h[]; vector<]; void dfs(int u){ dp[u][]=; dp[u][]=h[u]; ;i<son[u].size();i++){ int v=son[u][i]; dfs(v); dp[u][]+=max(dp[v]…
今天不想说太多废话-由于等下要写自己主动提交机. 不知道能不能成功呢? 题目的意思就是,一个猴子,在叠砖头 ...以下的要严格大于上面的.求叠起来最高能到多少- n非常少,n^2算法毫无压力-话说dp的n一般都小. 我们先排序.拍完序的状态转移方程是:  dp[i]=max(dp[j])+z[i],0<=i<=j.记得要等于. 之后再线性遍历一下找出max ,不然还是WA~ 还有在读入的时候,一个砖生成六个砖,能够自己暴力模拟一下.我是走循环的- 这个循环条件我也不知道怎么说.我仅仅是认为推断…
There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation forms a tree rooted at the rector V. E. Tretyakov. In order…
题目描述: 在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数,N和W中间用空格隔开.N为物品的数量,W为背包的容量.(1 <= N <= 100,1 <= W <= 10000) 第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值.(1 <= Wi, Pi <= 10000) Output 输…
http://acm.hdu.edu.cn/showproblem.php?pid=1520 父节点和子节点不能同时选. http://blog.csdn.net/woshi250hua/article/details/7641589 首先是建树,这个在之前的树形背包里有讲:http://www.cnblogs.com/qlky/p/5650783.html 因为这里没有指定根节点,所以可以建双向边,这样就可以从任一个点出发遍历 接下来是DP,状态转移方程: dp[fa][0] += max(d…
To My Girlfriend Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1288    Accepted Submission(s): 492 Problem Description Dear Guo I never forget the moment I met with you.You carefully asked me:…
题意: 给你一串数字,头尾不能动,每次取出一个数字,这个数字贡献=该数字与左右相邻数字的乘积,求一个最小值. 思路: 用dp[s][t]去代表s到t的最小值,包括a[s]和a[t],然后从区间为3开始枚举,对每个小区间枚举一个取出的数,状态转移方程就是:dp[s][t]=min(dp[s][k]+dp[k][j]+a[i]*a[k]*a[j]; PS: 操蛋的区间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头狼对相邻狼的加成值. 直接code-自行理解吧-. #include<bits/stdc++.h> using nam…
/* 看题解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 <sta…
题意:中文题/ 思路: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]只=dp[i][j]+dp[i-1][j]; 2.初始化DP数组问题,这个的话要看具体实现了,如果你使…