![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 87
ACdreamers
这个作者很懒,什么都没留下…
展开
-
HDU1058 Humble Numbers
题目:Humble Numbers humble number从1为"始祖",剩下的所有数,其实都是在此基础上乘以2,3,5,7演化出来的,代码主要语句:f[t]=min(2*f[i],3*f[j],5*f[k],7*f[l]);#include #include using namespace std;int f[5843],n;int i,j,k,l;int原创 2013-01-30 16:23:25 · 2549 阅读 · 3 评论 -
经典的导弹拦截问题
动态规划的几个基本概念想要掌握好动态规划,首先要明白几个概念:阶段、状态、决策、策略、指标函数。1. 阶段:把所给问题的过程,恰当地分为若干个相互联系的阶段,以便能按一定的次序去求解。描述阶段的变量称为阶段变量。2. 状态:状态表示每个阶段开始所处的自然状况和客观条件,它描述了研究问题过程中的状况,又称不可控因素。3. 决策:决策表示当过程处于某一阶段的某个状态时,可以原创 2012-06-03 08:59:41 · 13200 阅读 · 4 评论 -
DP之花店橱窗布置
题目:https://www.smartoj.com/p/1286分析:花瓶是有序的,花也是有序的,这就保证了有序性,从而满足子解的全局最优,和无后效性.假设dp[i][j]表示前i朵花,放在前j个花瓶里的最优值.则有:那么经过优化后得到:#include #include #include using namespace std;原创 2013-11-21 14:24:02 · 3458 阅读 · 0 评论 -
棋子--状态压缩dp
题目描述:在一个N*N的棋盘上放棋子,每一个棋子的上下左右都没有棋子,也就是不相邻,一共有多少种放法?(N sample_input013sample_output1263分析:首先,我们可以逐行来摆放这些棋子,这样我们会发现,每一行的摆放状态只和上一行有关,这样我们可以采用递推的方式来解决。 假设f[i][j]为第i行原创 2013-11-21 16:02:31 · 1897 阅读 · 1 评论 -
邮局--dp经典问题
题目:http://poj.org/problem?id=1160题意: 一些村庄被建立在一条笔直的高速公路边上,我们用一条坐标轴来描述这条高速公路,每一个村庄的坐标都是整数,没有两个村庄坐标相同。两个村庄间的距离,定义为它们的坐标值差的绝对值。我们需要在一些村庄建立邮局——当然,并不是每一个村庄都必须建立邮局,邮局必须被建立在村庄里,因此它的坐标和它所在的村庄坐标相同。每个村原创 2013-11-23 11:26:11 · 6440 阅读 · 1 评论 -
字符串的距离
题目:http://wikioi.com/problem/2180/ 题意:设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为“abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的扩展串,这里“□”代表空格字符。如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么我原创 2013-11-12 14:34:36 · 5346 阅读 · 7 评论 -
多重背包问题
题目:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 #include #include using namespace std;const int MAX = 100;int v[MAX];int w[MAX];int num[MAX]原创 2013-02-01 15:26:48 · 18126 阅读 · 0 评论 -
完全背包问题
题目:杭电1114 思路:动态规划之完全背包问题题目分析:给出了钱罐开始的重量e和装满后的重量f,然后给你n种硬币,每个价值为p,重量为w,求出最小的价值使钱罐的重量恰好为w如果不存在 输出This is impossible.状态转移方程:f[v]=min{f[v],f[v-w[i]]+p[i]}注意:一道简单的完全背包题(于0-1背包就是第二个for循环倒过来就行了),原创 2013-01-31 16:29:46 · 1443 阅读 · 0 评论 -
最大子段和
题目:Max Sum/** * 动态规划:计算最大子段和 * 算法描述: * 数组a 有n个元素, 记 s[i] 为从a[0]到a[i]中,包含a[i]的最大子段和 * 则: s[i] 的值为: s[i-1]>0时, s[i-1]+a[i],否则 a[i] * * p[i] 助于记录哪些单元被选择, p[i]=1 表示s[i]计算的结果中中使用了s[i-1]的值原创 2013-01-18 00:06:14 · 2814 阅读 · 0 评论 -
最长公共子序列问题
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。 其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的。 最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能原创 2013-01-19 00:40:11 · 2255 阅读 · 0 评论 -
石子合并(GarsiaWachs算法)
对于石子合并问题,有一个最好的算法,那就是GarsiaWachs算法。时间复杂度为O(n^2)。它的步骤如下:设序列是stone[],从左往右,找一个满足stone[k-1] stone[k+1]的k,找到后合并stone[k]和stone[k-1],再从当前位置开始向左找最大的j,使其满足stone[j] > stone[k]+stone[k-1],插到j的后面就行。一直原创 2014-01-09 17:14:39 · 12632 阅读 · 3 评论 -
石子合并问题
石子合并问题是最经典的DP问题。首先它有如下3种题型:(1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并成一堆的总花费最小(或最大)。分析:当然这种情况是最简单的情况,合并的是任意两堆,直接贪心即可,每次选择最小的两堆合并。本问题实际上就是哈夫曼的变形。(2)有N堆原创 2014-01-09 14:33:23 · 56176 阅读 · 9 评论 -
mod4最优路径问题
mod4最优路径问题如下图: 从1到4找出一条路径,要求路径的总长度mod4的余数最小。分析:一条从1到4的最优路径,在它走到2或3时mod4的余数不一定最小。也就是说,最优策略的子策略不一定最优,所以本问题不满足最优化原理,那么也就不能用动态规划来解决。但是我们可以把它转化为判定性问题,用递推来解决。设dp[k][i]为bool型数组,表示从原创 2014-01-19 13:38:42 · 2836 阅读 · 0 评论 -
HDU2227(非降子序列的个数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2227题意:给定一个长度为n(n 分析:如果n的值比较小,那么就是一个纯粹的dp题。设dp[i]表示以a[i]结尾非降子序列的个数,其状态转移方程为: 可以看出,这样做的时间复杂度是,很显然不能这样做。那么实际上,我们看到会想到逆序数,自然也会想原创 2014-01-20 17:46:10 · 2977 阅读 · 0 评论 -
编辑字符串距离
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183#include #include #include using namespace std;const int N = 1005;char S[N],T[N];int dp[N][N];int minnum(int x,原创 2013-12-19 17:01:34 · 1650 阅读 · 0 评论 -
01背包问题
问题描述:给定n种物品和一背包,物品i的重量是w[i],其价值是c[i],背包的容量是m,问如何选择装入背包中的物品总价值最大?问题的特点是:每种物品一件,可以选择放1或不放0。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}这个原创 2012-11-30 14:31:34 · 1331 阅读 · 0 评论 -
数塔问题和最长上升子序列问题
1.动态规划法:多阶段最优化决策解决问题的过程。特点:全面分阶段地解决问题,或者带决策的多阶段多方位的递推算法。(1)数塔问题 题目:数字三角形:实质是将n阶数塔变为n-1阶数塔,从n-1阶开始,逐渐递推到塔顶,其和就是最优解。代码:#include int max(int m,int n){ if(m>n) { return m; } else原创 2012-06-03 09:00:07 · 1786 阅读 · 0 评论 -
HDU1421 搬寝室
题目:搬寝室 典型的DP,状态方程:dp[k][i]=min(dp[k-1][i-2]+(a[i]-a[i-1])^2,dp[k][i-1]); dp[k][i] 表示 k 对物品在前 i 个物品的最小值#include#include#include#define N 2005using namespace std;int dp[N/2][N原创 2013-01-30 16:06:57 · 1114 阅读 · 0 评论 -
HDU1466 计算直线的交点数
计算直线的交点数 我们知道:n条直线互不平行且无三线共点的最多交点数max=1+2+……(n-1)=n(n-1)/2,但本题不这么简单,因为问题问的是:这些直线有多少种不同的交点数? 先来看个统计的方法:假设一共有n=a+b条直线(即n条直线分成2组,分别为a条和b条)则总的交点数= a内的交点数+b内的交点数+a,b之间的交点数我们来分析加入第N条直线的情况(原创 2013-01-30 14:47:11 · 1081 阅读 · 0 评论 -
经典的括号匹配问题
题目:括号配对问题#include #include using namespace std;int main(){ int t; cin >> t; while(t--) { string s; cin >> s; int num = 0;原创 2013-03-31 13:08:03 · 1449 阅读 · 0 评论 -
HDU4389(数位DP)
题目:X mod f(x) 题意:问在区间[A,B]之间,有多少个数满足,x%f(x)=0,f(x)代表x的各位数字之和。 解析:本题一是可以通过打表来计算,二是可以通过数位DP来求解。我们先来说打表吧。。。对于打表,当然我们不能直接打,这里有技巧。我们可以这样:每隔100000我们统计一次,这样在10^9范围内,我们得到10000个数。然后就很好解决了。。。#in原创 2013-07-13 15:15:12 · 20067 阅读 · 1 评论 -
HDU4604(双端队列与DP)
题目:Deque #include #include #include #include #include #include #define maxn 100010using namespace std;int val[maxn];int N;void DP(int num[],int dp[],int same[]){ int转载 2013-07-24 12:45:10 · 1499 阅读 · 0 评论 -
NEFU705(数论+DP)
题目:Heap#include #include #include using namespace std;typedef long long LL;const int N=1001000;const int MOD=20000003;LL dp[N];void extend_Euclid(int a,int b,int &x,int &y){ if(原创 2013-08-04 19:47:43 · 1122 阅读 · 0 评论 -
2013年东北赛B题(数位DP)
题目描述: Number Pairs Time Limited 1000ms Memory Limited 16M Description: Edward finds some Edward Number Pairs,which are defined below:原创 2013-08-21 15:52:58 · 1988 阅读 · 2 评论 -
Codeforces Beta Round #2--B题 (DP)
题目:The least round way 1000*1000的方阵,每个格子有一个非负整数,现在要从左上走到右下,每次只能向下或者向右走。目标是使得所有走的格子里的数的乘积里,末尾0的个数最少,要求输出最有解和走法。不用怎么想也知道基本是个dp了,可以发现其实只有2和5的因子是有用的,但是如果状态同时记录2和5的因子个数的话,就不好表示了。其实方法很简单,对2个5分别做一次,第一次原创 2013-03-16 13:40:54 · 1109 阅读 · 0 评论 -
HDU4532(组合DP)
题目:安排座位 解析:http://www.douban.com/note/269136472/ #include #include #include using namespace std;typedef long long LL;const LL MOD=1000000007;LL a[550];LL A[550];LL C[550]原创 2013-08-25 15:49:01 · 2252 阅读 · 0 评论 -
高度为k的二叉树个数(递推分析)
题目:http://www.nocow.cn/index.php/Translate:USACO/nocows 题意:给定n个节点,求形成高度为k且出度只能为0或2的二叉树的个数。 分析:我们用dp[n][k]来表示n个节点深度为k的上述二叉树的个数。很明显,如果n为偶数,那么dp[n][k]=0,所以我们只考虑n为奇数的情况。原创 2013-10-18 16:53:15 · 3142 阅读 · 0 评论 -
循环数组的最大子段和
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 题意:给定一个长度为50000的数组,求它的循环数组的最大子段和。 分析:本题与普通的最大子段和问题不同的是,最大子段和可以是首尾相接的情况,即可以循环。那么这个题目的最 大子段和有两种情况 (1)正常数组中间的某一原创 2014-08-22 19:41:38 · 4523 阅读 · 0 评论