动态规划

立体匹配算法SGBM

人走茶凉 提交于 2020-01-18 05:12:04
SGBM算法,作为一种全局匹配算法,立体匹配的效果明显好于局部匹配算法,但是同时复杂度上也要远远大于局部匹配算法。 原文链接: https://blog.csdn.net/renshengrumenglibing/article/details/8525328SGBM的基本原理 SGBM的基本步骤涉及:预处理、代价计算、动态规划以及后处理 预处理 Step1:SGBM采用水平 Sobel算子 ,把图像做处理,公式为: Sobel(x,y)=2[P(x+1,y)-P(x-1,y)]+ P(x+1,y-1)-P(x-1,y-1)+ P(x+1,y+1)-P(x-1,y+1) Step2:用一个函数将经过水平Sobel算子处理后的图像上每个像素点(P表示其像素值)映射成一个新的图像:PNEW表示新图像上的像素值。映射函数: 预处理实际上是得到图像的梯度信息 。经预处理的图像保存起来,将会用于计算代价。 预处理参数 1:preFilterCap: 水平sobel预处理后,映射滤波器大小默认为15 int ftzero =max(params.preFilterCap, 15) | 1; opencv测试例程test_stereomatching.cpp中取63。 代价计算 代价有两部分组成: 1经过预处理得到的图像的梯度信息经过 基于采样的方法得到的梯度代价

必须掌握的核心算法有哪些?

邮差的信 提交于 2020-01-17 17:33:22
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章: 三分钟基础知识:什么是栈?

leetcode刷题记第17题解法(python解析)

空扰寡人 提交于 2020-01-17 02:08:01
leetcode刷题记--> 17题解法(python解析) 题目定义 解题 1. 使用reduce方法进行解决问题 2. 动态规划 3. 动态规划 4. 使用递归 实现 题目定义 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。 来源:力扣(LeetCode) 链接: leetcode_17题 . 解题 本次使用4种方法,在leetcode上还有更多的方法,只能说真牛逼,真聪明。 1. 使用reduce方法进行解决问题 熟悉大数据的同学都知道map reduce 此处就使用reduce进行解决 2. 动态规划 使用列表生成式 3. 动态规划 同样是列表生成式,比较绕,仔细理解 4. 使用递归 对于打印"2345"这样的字符串: 第一次递归就是上图中最下面的方格,然后处理完第一个字符2之后,将输入的字符改变成"345"并调用第二个递归函数 第二次递归处理3,将字符串改变成"45"后再次递归 第三次递归处理4,将字符串改变成"5"后继续递归 第四次递归处理5,将字符串改变成"

相似基因(动态规划)

☆樱花仙子☆ 提交于 2020-01-16 23:53:30
相似基因 时间限制: 1 Sec 内存限制: 128 MB 提交: 19 解决: 12 [ 提交 ][ 状态 ][ 讨论版 ] 题目描述 大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。 在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。两个基因的相似度的计算方法如下: 对于两个已知基因,例如AGTGATG和GTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如: A G T G A T - G - G T - - T A G 这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示: 那么相似度就是:(-3)+5+5+(-2)+(-3)+5+(-3)+5=9。因为两个基因的对应方法不唯一,例如又有: A G T G A T G - G T T A - G 相似度为:(-3)+5+5+(-2)+5+(-1)+5=14。规定两个基因的相似度为所有对应方法中,相似度最大的那个。 输入 共两行。每行首先是一个整数,表示基因的长度;隔一个空格后是一个基因序列,序列中只含A,C,G,T四个字母。1<=序列的长度<=100。 输出 仅一行,即输入基因的相似度。 样例输入 7 AGTGATG

【高手训练】动态规划

核能气质少年 提交于 2020-01-16 09:29:43
T1.成绩单 期末考试结束了,班主任 老师要将成绩单分发到每位同学手中。 老师共有份成绩单,按照编号从到的顺序叠放在桌子上,其中编号为的成绩单分数为。 成绩单是按照批次发放的。发放成绩单时,老师会从当前的一叠成绩单中抽取连续的一段,让这些同学来领取自己的成绩单。 当这批同学领取完毕后,老师再从剩余的成绩单中抽取连续的一段,供下一批同学领取。 经过若干批次的领取后,成绩单将被全部发放到同学手中。 然而,分发成绩单是一件令人头痛的事情,一方面要照顾同学们的心理情绪,不能让分数相差太远的同学在同一批领取成绩单; 另一方面要考虑时间成本,尽量减少领取成绩单的批次数。 对于一个分发成绩单的方案,我们定义其代价为: \(a*k+b*\sum_{i=1}^k(max_i-min_i)^2\) 其中,是方案中分发成绩单的批次数,对于第批分发的成绩单,是最高分数,是最低分数。 是给定的评估参数。现在,请你帮助老师找到代价最小的分发成绩单的方案,并将这个最小的代价告诉老师。 当然,分发成绩单的批次数是由你决定的。 一道题面比较真实的题目 需要离散化,设状态 \(f[i][j][l][r]\) 为在[i,j]表示 \([i,j]\) 区间内取到剩余数字值域为区间 \([l,r]\) 的最小代价。特别的,令 \(f[i][j][0][0]\) 表示 \([i,j]\) 区间取完的最小代价。枚举一个中间点

最大子序和的golang实现

泪湿孤枕 提交于 2020-01-16 03:59:59
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 首先理解题意: 题目讲究的是连续,那我们可以假设一下,我们现在以下标为0的值为基准值,那么下一位就分为两种情况了: 下一位为负数,那么我们就要与基准值比较,看哪个大 下一位为正数,那么我们肯定是要相加了 核心代码: //取出第一位为基准值 sum := nums[0] res := sum //下标从1开始 for i := 1; i < len(nums); i++ { //当值是负数的时候,就要与res比较,取出最大的 //当值为正数的时候,就要与res相加,那么才会更大 if sum < 0 { sum = nums[i] } else { sum += nums[i] } res = max(res, sum) } 整体代码: package main import ( "fmt" ) func maxSubArray(nums []int) int { //取出第一位为基准值 sum := nums[0] res := sum //下标从1开始 for i := 1; i < len(nums); i++ { //当值是负数的时候

动态规划之最长公共子序列问题

强颜欢笑 提交于 2020-01-15 21:08:26
由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。 用c[i][j]记录序列X和Y的最长公共子序列的长度,其中, Xi={x1,x2,…,xi};Yj={y1,y2,…,yj}。 当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。 故此时C[i][j]=0。其他情况下,由最优子结构性质可建立递归关系如下: void LCSLength( int m,int n,char *x,char *y,int **c,int **b ) //c[i][j] 记录Xi和Yj 的最长公共子序列长, { int i,j; //b[i][j] 记录c[i][j]是由哪个子问题得到的。 for (i = 0; i <= m; i++) c[i][0] = 0; //第一列 for (i = 0; i <= n; i++) c[0][i] = 0; //第一行 for (i = 1; i <= m; i++) for (j = 1; j <= n; j++) { if (x[i]==y[j]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=1;} //if 左上角 else if (c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=2;} //else if 上面 else { c[i][j]=c[i][j-1]

HDU1003 Max Sum 题解 动态规划 最大字段和扩展

我的梦境 提交于 2020-01-13 22:48:24
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目大意: 求解一个序列的最大字段和,已经最前面的那个最大子段的起止坐标。 解题思路: 定义状态 \(f[i]\) 为以 \(a[i]\) 结尾的最大字段和,则有状态转移方程: \[f[i] = \max(0, f[i-1]) + a[i]\] 同时定义状态 \(s[i]\) 表示以 \(a[i]\) 结尾的最大字段的最左边元素的坐标,则有: 当 \(f[i] \lt 0\) 时, \(s[i] = i\) ; 当 \(f[i] \ge 0\) 时, \(s[i] = s[i-1]\) 实现代码如下: #include <bits/stdc++.h> using namespace std; const int maxn = 100010; int T, n, a[maxn], f[maxn], anss, anst, s[maxn], ans; int main() { scanf("%d", &T); for (int cas = 1; cas <= T; cas ++) { if (cas > 1) puts(""); scanf("%d", &n); for (int i = 1; i <= n; i ++) scanf("%d", a+i); ans = f[1] =

动态规划理解

痞子三分冷 提交于 2020-01-13 13:45:02
动态规划 基本思想 动态规划算法与分治法类似,其基本思想也是将待求解问题分解乘若干个子问题,先求子问题, 然后从这些子问题的解得到原问题的解。动态规划中分解得到的子问题往往不是相互独立的。 若用分治法,则分解的子问题数目会太多,导致时间复杂度过高。在动态规划中我们将已解决 子问题的答案保存在一个表,在需要时在找到以求的答案,这样可以避免大量的重复计算,这 便是动态规划的基本思想。 步骤: (1)找出最优解的性质,并刻画其结构特征 (2)递归定义最优质 (3)以自底向上的方式计算出最优值 (4)根据计算最优值时得到的信息构造最优解 习题递归方程 //单调递增最长子序列 //ans[i]表示以元素a[i]为结尾的最长递增子序列的值 for(int i=1;i<=n;i++) for(int j=0;j<=i;j++) { if(a[i]>a[j]&&ans[i]<ans[j]+1) ans[i]=ans[j]+1; res=max(res,ans[i]); }     cout<<res<<endl; //租用游艇问题 //dp[i]表示从1到i花费的最少钱 for(int i=2;i<n;i++) { for(int j=i+1;j<=n;j++) { cin>>temp; if(dp[i]+temp<dp[j]) dp[j]=dp[i]+temp; } } cout<<dp[n]<

Leetcode516. 最长回文子序列

浪尽此生 提交于 2020-01-13 00:19:27
题目 给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入:“bbbab” 输出:4 一个可能的最长回文子序列为 “bbbb”。 示例 2: 输入:“cbbd” 输出:2 一个可能的最长回文子序列为 “bb”。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 方法 class Solution { //动态规划 public int longestPalindromeSubseq ( String s ) { int len = s . length ( ) ; int [ ] [ ] f = new int [ len ] [ len ] ; for ( int i = len - 1 ; i >= 0 ; i -- ) { // f [ i ] [ i ] = 1 ; for ( int j = i + 1 ; j < len ; j ++ ) { if ( s . charAt ( i ) == s . charAt ( j ) ) { f [ i ] [ j ] = f [ i + 1 ] [ j - 1 ] + 2 ; } else { f [