![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法----动态规划
文章平均质量分 59
大章鱼(张文哲
你所做的别只停留在 还行
展开
-
划分数
题目: 输入 n=4 m=3 M = 10000 输出. 4 (1+1+2=1+3=2+2=4) 分析: 这样的划分被称作n的m划分,特别地,m=n时称作n的划分数”。DP不仅对于求解最优问题有效,对于各种排列组合的个数、概率或者期望之类的计算同样很有用。在此,我们定义如下。 dp[i][i]=j的i划分的总数 根据这一定 义可以得到怎样的递推关系呢? 将j分划分i...原创 2020-03-20 19:02:43 · 404 阅读 · 0 评论 -
最长上升子序列问题
题目: 输入 n=5 a={4,2,3,1,5} 输出 3 (a, a, a,构成的子序列2, 3,5最长) 分析: 这个问题是被称作最长上升子序列( LIS, Longest Increasing Subsequence)的著名问题。这一问 题通过使用DP也能很有效率地求解。我们首先来建立一下递推关系。 定义dp[i]:=以ai为末尾的最长上升子序列的长度 以a结...原创 2020-03-20 18:22:10 · 271 阅读 · 0 评论 -
多重部分和问题
题目: 输入 n =3 a={3,5,8} m={3,2,2} K =17 输出 Yes(3*3+8=17) 分析: 这个问题可以用DP求解,不过如何定义递推关系会影响到最终的复杂度。首先我们看一下如下定义: dp[i+1][i]:=用前i种数字是否能加和成j 为了用前种数字加和成j,也就需要能用前i- 1种数字加和成j,j一ai,…,j -k*ai,中的某一种。 由...原创 2020-03-20 17:39:58 · 178 阅读 · 0 评论 -
部分和问题
题目: 输入 n=4 . a={1,2,4,7} k=13 输出 Yes (13 =2+4+7) 输入 n=4 a={1,2,4,7} k=19 输出 No 分析: 递归状态搜索分析: 从a1开始按顺序决定每个数加或不加,在全部n个数都决定后再判断它们的和是不是k即可。因为状态数是2^(n+1),所以复杂度是0(2^n)。如何实现这个搜索,请参见下面的代码。注意a...原创 2020-03-20 17:27:16 · 228 阅读 · 0 评论 -
一文学懂动态规划
前言 动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地达到我们合理薅羊毛的目的 ,很多时候都能看到它的身影。不过动态规划对初学者来说确实比较难,dp状态,状态转移方程让人摸不着头脑,网上很多人也反馈不太好学,其实就像我们之前学递归那样,任何算法的学习都...原创 2020-02-22 00:46:39 · 396 阅读 · 0 评论 -
最长公共子序列
问题描述: 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 问题分析: 使用递归的基础之上,进行了相应的剪枝操作,避免重复计算。 代码实现: #include<cstdio> #include<cstrin...原创 2019-05-14 09:05:04 · 289 阅读 · 0 评论 -
0-1背包
问题描述: 0-1背包(0-1 knapsack): 有一个背包,体积为V,现在有 n 个物体,且物体 i 的价值为 pi,要求在不超过背包体积 V 的情况下背包中放入物体的最大价值之和; 如:4 8 2 1 4 1 2 4 3 3 问题分析: #include<cstdio> #include<algorithm> using namespace std; int n...原创 2019-05-15 09:21:30 · 312 阅读 · 0 评论