动态规划
Jaster_wisdom
程序员
展开
-
POJ 2479 (动态规划)
作为比较经典的算法思想,动态规划恐怕早已深入人心。今天在网上找了一个 题目来练练手。题目大意:给出一个 数字序列,求出最大的两个不连续子串之和 。 这道题 看似 就是 最大子序列和 的一个变种。本质都是用 DP 来解决。首先,将 a[i] 表示第 i 个元素,再建立 三个数组 tm[num],sm[num],stm[num]含义如下: tm[i] 表示 以第i个元素结尾的最大字原创 2016-02-09 22:28:18 · 1171 阅读 · 0 评论 -
蓝桥杯-矩阵乘法
题目大意:有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r。题目分析:本题是计算一系列连乘矩阵的最小运算次数。这是一道非常经典的动态规划的题目。动态规划算法的特点是:1.把原始问题划分成一系列子问题2.求解每个子问题仅一次,并将...原创 2018-03-13 01:37:33 · 928 阅读 · 0 评论 -
蓝桥杯-数字三角形
题目大意:编写程序计算从三角形顶部到底部的某处的一条路径,使得该路径所经过的数字的总和最大。●每一步可沿左斜线向下或右斜线向下走;●1<三角形行数≤100;●三角形中的数字为整数0,1,…99;题目分析:很好的一道动态规划的例子。解题思路是自底向上分析,既然这条路径能从顶部到底部,那么从下往上看,也是等效的。我们设cost[i][j]表示包含第i行,第j列的数字的当前最大值。比如,从下往上看,co...原创 2018-03-13 20:06:23 · 621 阅读 · 0 评论 -
蓝桥杯-最大子阵 动态规划
题目大意:给定一个矩阵,求出它的子矩阵中元素之和的最大值题目分析:这道题明显是用 动态规划来做。我们可以先分析一维数组的情况,num[] = {1,-3,5,2,-6,9},考虑类似这样的数组,要求出它的最长连续子序列和的最大值。我们从左往右扫描,用dp[i]表示以第i个元素为末尾元素的连续子序列和的最大值。也就是第i个元素一定要包括在内。那么,我们可以得到dp[i] = max(dp[i-1]+...原创 2018-03-23 20:00:23 · 1221 阅读 · 0 评论 -
蓝桥杯-结点选择 (树形动态规划)
题目大意:给定一棵树,每个结点存储一个权值,从树中选择某些结点,使得总的权值最大。在选择结点时,有一个要求:当选定一个结点时,与该结点相连接的结点就不能选取。题目分析:方法:深度搜索+树形动态规划。对于每个点,有两个选择,分别是选和不选。对于第i个结点,我们用dp[i][0]表示不取该结点,所能达到的最大值;dp[i][1]表示取该结点,该结点所能达到的最大值。第一种情况,当我不取第i个结点,当前...原创 2018-03-20 14:19:07 · 1879 阅读 · 0 评论 -
蓝桥杯-未名湖边的烦恼 (递归和递推解法)
题目大意:有一群人要还鞋,一群人要租鞋。还鞋的每个人叫做A,租鞋的人叫做B,每个A和每个B之间没有区别。求出有多少种排序方法,使得不会出现租鞋不够用的情况?分析:每一种合理的排序方法必须满足:无论截止到哪个人,在他前面并且包括他,还鞋的人必须大于等于租鞋的人的数量。解法1:递归法当第i个人要去排队时发现,另一类人已经全部排完了,那么解法只有一种了。比如:一个A去排队时,所有的B已经拍好了,那么所有...原创 2018-03-21 15:08:34 · 845 阅读 · 2 评论 -
蓝桥杯-合并石子 (经典动态规划)
题目大意:假设有一排n堆石子,每堆石子有若干个小石子,要求将它们合并成一堆,需要花费的最小代价。而且每次合并只能将相邻的两堆合并,合并的代价是两堆石子的重量之和。题目分析:因为不能合并有间隔的石子堆,所以这不是一道哈夫曼树的例子(哈夫曼树:利用贪心算法,每次合并重量最小的两堆石子)。通过分解子问题,我们可以发现,当只有一堆石子时,合并代价为0;当有两堆石子时,合并代价是两堆石子重量之和;当有三堆石...原创 2018-03-25 21:54:09 · 3394 阅读 · 3 评论 -
蓝桥杯-最大的算式
题目大意:给定一个数字序列,要求在其中插入固定个数的*和加号+,使得算式的结果最大。题目分析:我们用sum[i]保留前i个数的和,用dp[i][j]保留前i个数中含有j个乘号的最大的结果。那么我们最终要求的是dp[N][K]。显然,dp[i][0]=sum[i],因为没有一个乘号,所以就相当于求前n项和。我们自底向上求解。以题干中的数据为例子:N = 5, K=2五个数分别是:1 2 3 4 5i...原创 2018-03-22 00:43:45 · 860 阅读 · 2 评论 -
Leetcode3. Longest Substring Without Repeating Characters(无重复字符的最长子串)
题目大意:求出一给定字符串的最长子串,要求子串中的字符无重复。子串与子序列的区别是:子串必须要求是相连着的字符组成,而子序列则允许字符可间断。题目分析:用num[i]表示以字符s[i]结尾的最长子串,我们只要将指针从i往前扫描,发现有重复的字符则停止计数,得到的数值即以s[i]结尾的最长子串的长度。时间复杂度为O(n^2)代码展示:class Solution {public: int ...原创 2018-04-10 15:33:46 · 249 阅读 · 0 评论 -
LeetCode53. 最大子序和 (动态规划/分治法)
题目大意:求出一个序列的最大子序和,顾名思义,就是一段最大的连续序列的和题目分析:本题可以用两种解法求解,动态规划或分治法法一:动态规划,用result[i]保存以数字nums[i]结尾的最大子序和,然后不断更新result数组的最大值即可。时间复杂度O(n)代码展示:class Solution(object): def maxSubArray(self, nums): ...原创 2018-06-12 10:43:31 · 6091 阅读 · 2 评论 -
LeetCode120. 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。题目分析:本题自顶向下和自下而上最小路径和是一样的。为了便于分析,我们从倒数第二行的第一个数开始遍历,将每个数的...原创 2018-07-23 16:32:33 · 994 阅读 · 0 评论 -
LeetCode72. 编辑距离
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符 删除一个字符 替换一个字符示例 1:输入: word1 = "horse", word2 = "ros"输出: 3解释: horse -> rorse (将 'h' 替换为 'r')rorse -> ros...原创 2018-07-24 08:53:40 · 386 阅读 · 0 评论 -
LeetCode64. 最小路径和
题目大意:求出从网络左上角到右下角的一条代价最小的路径和。题目分析:使用动态规划,求出左上角到网络中每个点的代价最小路径和,假设当前要求的是point(i,j)点,那么它的值就应该是从左上角到它上面那个点point(i-1,j)的路径和,与 从左上角到它左边那个点point(i,j-1)的路径和,两者中的最小值加上它自身的值。特别地,第一行的最小路径和只能从左边向右移动,所以grid[0][j] ...原创 2018-07-14 21:01:29 · 1347 阅读 · 0 评论 -
LeetCode845. 数组中最长的山脉
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:B.length >= 3 存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1](注意:B 可以是 A 的任意子数组,包括整个数组 A。)...原创 2018-07-26 20:35:40 · 872 阅读 · 0 评论 -
LeetCode91. 解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。示例 2:输入: "226"输出: 3解释: 它可以解码为 "BZ&qu原创 2018-07-21 19:22:17 · 1661 阅读 · 0 评论 -
LeetCode198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃...原创 2018-08-11 23:10:25 · 399 阅读 · 0 评论 -
九度OJ 1123 采药 0/1背包问题
题目链接:http://ac.jobdu.com/problem.php?pid=1123题目大致意思是:给定一定的时间和草药的种类,采摘所花的时间,价值。要求的是在规定时间内求出采摘采药的最大价值。这道题我刚开始的思路是用贪心算法来做,按价值大小排序,每次选择价值最大的,然后看剩下的时间还够不够。后来发现不对。比如,草药时间,价值分别为90 100;40 70; 20 40 当我有1原创 2016-08-10 13:37:13 · 1310 阅读 · 0 评论 -
九度OJ 1114 神奇的口袋
题目描述:有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。输入:输入的第一行是正整数n原创 2016-08-08 21:41:06 · 1248 阅读 · 0 评论 -
九度OJ 1102 最小面积子矩阵 (+最短连续子序列)
题目描述:一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积)输入:每个案例第一行三个正整数N,M接下来N行,每行M个数,表示矩阵每个元素的值输出:输出最小面积的值。如果出现任意矩阵的和都小于K,直接输出-1。样例输入:4 4 101 2 3 45 6 7 89 10 11原创 2016-08-08 17:29:18 · 2990 阅读 · 3 评论 -
POJ 2593
题目:求一个序列中最大的两段不连续子串之和。很明显,这道题是用动态规划 来解答,主要是 列出状态转移方程tm[i]代表第i个数结尾的最大子串sm[i]代表第i个数开头的最大子串stm[i]代表后面n-i+1个元素的最大值#includeusing namespace std;#define MAX 100001#define max(a,b) a>b?a:bint原创 2016-02-09 23:12:13 · 800 阅读 · 0 评论 -
POJ 1015
这道题应该来说,比较难,特别是变量的下标 有点多 且比较复杂。题目的意思是:给出n组数,每组数有一个P[i],D[i], 求出其中的m组,使得sum(P[i])-sum(D[i])绝对值最大,如果有多个这样的值,取其中sum(P[i])+sum(D[i])最大的一组分析:算法思想,动态规划用 V(i) 表示第i组的辩控差用S(i) 表示第i组的辩控和用f(j,k)原创 2016-02-12 14:39:48 · 556 阅读 · 0 评论 -
POJ 1141
题目:定义合法的括号序列如下:1 空序列是一个合法的序列2 如果S是合法的序列,则(S)和[S]也是合法的序列3 如果A和B是合法的序列,则AB也是合法的序列例如:下面的都是合法的括号序列(), [], (()), ([]), ()[], ()[()]下面的都是非法的括号序列(, [, ), )(, ([)], ([(] 给定一个由'原创 2016-02-14 10:28:32 · 592 阅读 · 0 评论 -
程序员互动联盟(第一届编程大赛第一题)
题目大意:将1到N的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等的。例如,输入N=3,对应的集合{1,2,3} 可以被划分为{3},{1,2}两个子集合,这两个子集合中元素分别的和是相等的。输入7,输出4思路:首先1,2,3……N所有元素的和为 S= N*(N+1)/2, 如果S不能被2整除,那么一定不能划分,否则各个集合里面的元素之和为 S = N*(原创 2016-03-30 16:00:05 · 952 阅读 · 0 评论 -
POJ 1088
看完该题,第一个想法是,找到 数组中 最大的数,然后在其周围找一个仅次于它大小的数,然后这样循环下去,不过这样好像比较麻烦。当某点上下左右四个点 都是一样大时,需要保留四个方向的值。后来采用 动态规划+递归,用len[i][j] 表示从(i,j)点开始的最大深度,动态转移方程: len[i][j] = max(len[i-1][j],len[i+1][j],len[i][j-1],len[i]原创 2016-03-19 10:24:14 · 687 阅读 · 0 评论 -
POJ 1861
题目大意:某公司需要用线缆将网络中的结点连接起来,每两个结点之间有一个权值,选择若干条线缆,要求是任意两个点之间可达,并且要使最长的线缆最小。思路:本质上将就是一个最小生成树的例子,因为这里要输出最长的线缆长度,所以用Kruskal算法较为便捷。 Kruskal算法就是 不断地选择不构成环的最小的边。不构成环,这里用的是 并查集,看看两者是不是可达。 这里着重讲一下并查集。首先原创 2016-04-01 09:30:22 · 687 阅读 · 0 评论 -
最大子数组问题
问题的意思也就是,求出一个数组中连续的几个元素的最大值。思路:先用一种分治的方法来解。 时间复杂度为O(nlgn)将求A[i,...,j]上最大子数组和为问题 分解成以下三种情况,令mid=(i+j)/2第一,求出A[i,...,mid]上的最大子数组和第二,求出A[mid+1,...,j]上的最大子数组和第三,结果跨跃mid,也就是说,子数组必将是A[...,mid,原创 2016-04-28 21:54:38 · 510 阅读 · 0 评论 -
最大的矩形 (201312-3)
问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。 请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。输入格式 第一行包含一原创 2016-04-21 16:18:01 · 642 阅读 · 0 评论 -
动态规划之切割钢条
问题描述:给定一个数组p[i],表示钢条长度为i时,可以销售的价格。为了使一块钢条效益最大化,问应该怎样切割钢条?解析:假设长度为4的钢条,可以有以下几种方案:1.不切割 2.切成1,3两段 3.切成2,2两段 4.切成3,1两段 5.切成1,1,2三段 6.切成1,2,1三段7.切成2,1原创 2016-05-17 19:58:53 · 717 阅读 · 0 评论 -
九度OJ 1011 最大连续子序列
题目描述: 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 输入: 测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( K输出: 对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子原创 2016-06-15 11:19:54 · 1085 阅读 · 0 评论 -
九度OJ 1042
题目描述:Find a longest common subsequence of two strings.输入:First and second line of each input case contain two strings of lowercase character a…z. There are no spaces before, inside or af原创 2016-07-09 16:15:22 · 633 阅读 · 0 评论 -
九度OJ 1077 最大序列和
题目描述:给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。对于S的所有非空连续子序列T,求最大的序列和。变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。 输入:第一行为一个正整数N,第二行为N个整数,表示序列中的数。输出:输入可能包括多组数据,对于每一原创 2016-07-30 19:53:16 · 808 阅读 · 0 评论 -
华为OJ 合唱队
描述计算最少出列多少位同学,使得剩下的同学排成合唱队形说明:N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1Ti+1>......>TK。 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出原创 2016-07-31 20:37:28 · 2929 阅读 · 0 评论 -
九度OJ 1139 最大子矩阵
题目描述:已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。比如,如下4 * 4的矩阵0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2的最大子矩阵是9 2-4 1-1 8这个子矩阵的大小是15。输入:输入是一个N * N的矩阵。输入的原创 2016-08-17 21:55:36 · 736 阅读 · 0 评论 -
九度OJ 1112 拦截导弹
题目描述:某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。 输入:每组原创 2016-08-07 21:45:40 · 1149 阅读 · 0 评论 -
LeetCode300. 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。题目分析:方法一:动态规划,用dp[i]表示以nums[i]结尾的最长...原创 2018-08-22 15:01:21 · 1460 阅读 · 0 评论