初探动态规划(DP)】的更多相关文章

一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F(9)=F(8)+F(7),F(8)=F(7)+F(6)  ....... 我们把一个复杂的问题分阶段进行简化,逐步简化成简单的问题.这就是动态规划的思想. 当只有一级台阶和两级台阶的时候,走法为1和2. 由此归纳出公式: F(1)=1 F(2)=2 F(n)=F(n-1)+F(n-2)  (n>=…
算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得到最终问题的解. 关键点就是找到状态转移方程和初始边界条件,说白了就是要找到"递推公式"和初始值,然后计算时保存每一步中间结果,最后累加判断得到结果. 0.求数组最值 求数组最值方法很多,这里使用动态规划的思想来尝试处理,以便更好地理解DP的思想.为了方便这里假设数组a[i]大小为n,要找…
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门动态规划的真正意义. 奶萌兔的温馨提示:建议先理解dfs哦~(本文以一种较为新奇的方式解释DP) 动态规划 那什么是动态规划? 来问问神奇的奶萌兔吧(强行盗梗)! (奶萌兔来给你讲解啦~虽然还在睡觉=w=) 动态规划(英语:Dynamic programming,简称DP)是一种在数学.管理科学.计…
因为这题,气得我火冒三丈! 这数据是不是有问题啊!我用cin代替scanf后居然就AC了(本来一直卡在Test 18)!导致我调(对)试(排)了一个小时!! UPD:后来细细想想,会不会是因为scanf的读入,数组要开大一点点呢?比如读一个长为$n$的字符串,需要一个$str[n + 1]$? 题目 就是找出有多少条经过所有可行格子的回路. 插头DP 一直没有时间学习,然后最近膜拜了一下cdq的<基于连通性状态压缩的动态规划问题>,然后写了一裸题. 其实也很好写嘛,不过在转移的时候要万分小心,…
[数据结构与算法] DP 动态规划 介绍 原创 2017年02月13日 00:42:51 最近在看算法导论. DP全称是dynamic programming,这里programming不是编程,是一个表格保存之前的结果. DP 是一种编程思想,主要用于解决最优解类型的问题. 其思路是为了求解当前的问题的最优解,使用子问题的最优解,然后综合处理,最终得到原问题的最优解. 但是也不是说任何最优解问题都可以DP,使用dp的问题一般满足下面的两个特征: (1)最优子结构,就是指问题可以通过子问题最优解…
写一写要讲什么免得忘记了.DP的优化. 大概围绕着"是什么","有什么用","怎么用"三个方面讲. 主要是<算法竞赛入门经典>里的题目讲解,但是有些过于简单的删去了,添加了一些不怎么简单的省选题目作为例子 这里的DP优化都是涉及到O(nk)到O(nk-1)方法比较巧妙也有用到数学里面的定理之类. 所以秉着由易到难的原则,安排内容如下: 专题1:动态规划基础知识和计数DP.数位DP(几大类DP的类型介绍) 专题2:DP的简单优化(稍微提…
搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14107    Accepted Submission(s): 4751 Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是…
龟兔赛跑 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 1   Accepted Submission(s) : 1 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟…
题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看似状态不同罢了~~~ QAQ Round1:枚举当前点取或不取,当前点 i 取的话那么在前 KK 的数中必须要选择一个数字点 k 不取并且将 k+1 到 i 做为新的区间,最后取最优的 k 作为转移记录下来,并且其满足最有子结构. 所以状态就是:dp[i][0/1] 表示以 i 为结尾是否取 i 最…
百度百科↓ 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划.1957年出版了…
Super Jumping! Jumping! Jumping!Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 47017    Accepted Submission(s): 21736 Problem DescriptionNowadays, a kind of chess game called “Super Jumping! Ju…
16-矩形嵌套 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:13 submit:28 题目描述: 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入描述: 第一…
CF498B 动态规划f[i][j]表示前i秒时间听了j首歌的概率,则有: \(f[i][j]=∑f[i-k][j-1]*(1-p_j)^{k-1}*p_j\) k枚举i秒前的每一秒,要求前i-1秒都不跳歌,且在第i秒跳歌 这个方程直接转移的时间复杂度为\(O(NT^2)\). 尝试进行优化. 观察可以发现,f[i][j]与f[i-1][j]的方程基本不变,考虑直接从f[i-1][j]转移到f[i][j]. 时间复杂度降到\(O(NT)\). #include <bits/stdc++.h>…
一.斐波那契数列(递归VS动态规划) 1.斐波那契数列——递归实现(python语言)——自顶向下 递归调用是非常耗费内存的,程序虽然简洁可是算法复杂度为O(2^n),当n很大时,程序运行很慢,甚至内存爆满. def fib(n): #终止条件,也就是递归出口 if n == 0 or n == 1: return 1 else: #递归条件 return (fib(n-1) + fib(n - 2)) 2.斐波那契数列——动态规划实现(python语言)——自底向上 动态规划——将需要重复计算…
通过最近对于一些算法题的思考,越来越发现动态规划方法的在时间上高效性,往往该问题可以轻松的找到暴力破解的方法,其时间复杂度却不尽人意.下面来看看几个常见的动态规划思路的经典问题 例一.有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?(腾讯电面题之一) 其状态转移方程为: f(n):表示n阶楼梯有多少种走法 f(n)=f(n−1)+f(n−2) f(1)=1,f(2)=2 例二:01背包问题 有n个重量和价值分别为vector weight, vector…
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目分析:此题采用动态规划自底向上计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后一排数其中一个,向上退,倒数第二步肯定走最后一排数对应的倒数第二排最大的一个(将最后对应最后步走的最大的数加起来存在倒数第二步的数组中)再向上推,一直推到最上面的第0步,那么]最后所存的结果一定是最大的. 代码如下:  #include <iostream> #include <algorith…
动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3&sectionid=2&problemid=4 题目大意:找到一个最多的老鼠序列,使得序列中的老鼠的体重满足递增,相应老鼠的速度满足递 减.即可要求找出老鼠体重递增,速度递减的最长子序列(不需要连续). 思路:动态转移方程的确定,状态f[i]表示前i个老鼠中的最长递减子序列长度,状态转移方程为mouse[i].len…
问题描述: 在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行).给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益.请采用实践复杂度低的方法实现. 给定价格序列prices及它的长度n,请返回最大收益.保证长度小于等于500. class Solution { public: int maxProfit(vector<int>& prices) { //It's wrong if you c…
题目来源:https://biancheng.love/contest-ng/index.html#/41/problems G 听说你会打地鼠 时间限制:300ms   内存限制:65536kb 题目描述 打地鼠是个很简单的游戏,不过你知道怎么打地鼠才能最省力吗? 每时刻,都有N只地鼠在pi(xi,yi)位置出现,打掉一只,该时刻其他地鼠会消失. 打掉第一只地鼠不消耗能量,之后每只地鼠消耗的能量约与鼠标移动距离成正比,即cost = dis(pi,pi+1)(平面上两点距离怎么求不多说了) 现…
题目链接:http://poj.org/problem?id=1088 Memory: 252KTime: 16MSLanguage: C++Result: Accepted 解题报告: 1.lm[i][j]表示maps[i][j]所能到达的最长长度 2.状态转移方程 lm[i][j]=max(maps[i][j]四周的最大lm)+1; #include <stdio.h> #include <algorithm> #include <string.h> using n…
看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6dPf8I0b5unSmQM6Ji7tNTKU1LFWDyiCoJaMj8hHb_AakLqFZFuz0vxwWHiSdTLqn10FsO2tZx6W上面还有我的评论哦. 解题报告:1.对于每一节字符串表示的数,用二维数组sum[i][j]记录2.状态转移方程 f[i][j]=min(f[i-k][…
数位dp有着很明显的特点,一般来说是给定区间[l,r]求满足某种条件区间中的数有多少个 朴素解法一般是O(n)的而n往往很大(10^8起步) 这时候我们就要想办法优化,于是就有了数位dp 数位有两个基本的原则 对于区间数的个数,我们转化为前缀和做(即ans=sum(r)-sum(l-1)) 逐位确定 我认为第二条很关键,可以说是数位dp的精髓 一般来说数位dp分两步 打表 形如f[i,j]到有i位且最高位为j的满足条件的个数 统计前缀和 统计前缀和我们需要用到一个非常重要的结论 对于任意一个小于…
10.1.5.253 1143 数字金字塔#include <iostream> #include<string.h> using namespace std; int a[1005][1005],b[1005][1005]; int n; int max(int x, int y) { return x>y?x:y ; } int f(int i,int j) { if(b[i][j]!=-1) return b[i][j]; return b[i][j]=a[i][j]+…
dp[i]表示以s[i]结尾的完全匹配的最大字符串的长度. dp[] = ; ; 开始递推 s[i] = ')' 的情况 先想到了两种情况: 1.s[i-1] = '(' 相邻匹配 这种情况下,dp [i] = dp[i-2] + 2. 2.s[i-1] = ')' 这种情况下,第一感觉是要看dp[i-1]的值,即 j...i-1是完全匹配的话,i相当于在外面再包一个括号. 如果s[i] 和 s[ i-1-dp[i-1] ] 匹配,dp[i] = dp[i-1] + 2.否则dp[i] = 0.…
[JL]最后的晚餐 TimeLimit:1000MS  MemoryLimit:1000KB 64-bit integer IO format:%lld Problem Description [题库搜索“JL”查看更多建兰题库题目] 话说YZJ编的某程序超时了1000倍(- -!),所以他不得不在自己家门口亲眼见证这个电影般的场景.虽然他不想错过这个美妙的时刻,但是他的肚子一再抗议,要求先吃完这最后的晚餐. 现在YZJ准备依次吃n道菜.但是他只使用勺子和筷子吃,勺子和筷子可以交替使用,但是同一…
题目链接:http://poj.org/problem?id=1015 大致题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团.选m 人的办法是:控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20.为了公平起见,法官选出陪审团的原则是:选出的m 个人,必须满足辩方总分D和控方总分P的差的绝对值|D-P|最小.如果有多种选择方案的|D-P| 值相同,那么选辩控双…
问题1:找硬币,换钱的方法 输入: penny数组代表所有货币的面值,正数不重复 aim小于等于1000,代表要找的钱 输出:换钱的方法总数 解法1:经典dp,空间复杂度O(n*aim) class Exchange { public: int countWays(vector<int> penny, int n, int aim) { if (penny.empty()||n == 0) return 0; vector<vector<int> > dp(n,vect…
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1360    Accepted Submission(s): 672Special Judge Problem Description The company "21st Century Fruits" has specialized in cre…
Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14584    Accepted Submission(s): 6313 Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble numbe…
貌似开坑还挺好玩的...开一个来玩玩=v=... 正好自己dp不是很熟悉,就开个坑来练练吧...先练个50题?小目标... 好像有点多啊QAQ 既然是开坑,之前写的都不要了! 50/50 1.洛谷P3399 丝绸之路 简单的线性dp 点我看题 因为是开坑所以题意就不讲了,自己看题吧,一些题意比较迷的会讲一下. 这题其实还挺简单的. 设 f[i,j] 表示到第 i 个城市用了 j 天所需要的最小疲劳值. 很快dp方程就出来了.  f[i,j]=min(f[i,j-1],f[i-1,j-1]+d[i…