算法题
leetcode
「已注销」
好好学习 好好生活
展开
-
序列比对之动态规划
序列比对问题描述输入:两个序列A和B,其长度分别为m和n输出:A和B的一种比对形式,其满足惩罚函数f(A,B)值最小。(1) 对A和B之间的每一个空隙匹配,计惩罚分2分;(2)对A和B之间的每一个错配,计惩罚分3分;(3)成功配对不计惩罚分最后求解得到最小的罚分值:问题分析1、分析问题的最优子结构性质假设两个序列S1和S2,求他们的最长公共子序列,则:1)S1[i] = S2[j],那么这两个数匹配2)S1[i] != S2[j],S1[i-1] = S2[j],那么S1[i]匹配空原创 2020-12-18 17:16:49 · 1983 阅读 · 1 评论 -
最长公共子序列之动态
最长公共子序列(LCS)问题描述给定两个字符串,求解这两个字符串的最长公共子序列。如: S1={1,5,2,8,9,3,6},S2={5,6,8,9,3,7}其最长公共子序列为{5,8,9,3},最长公共子序列长度为4。思路分析1、分析问题的最优子结构性质因此,两个序列的最长子序列包含了这两个序列的前缀的最长公共子序列。2、建立递推公式3、自底向上求解最优值4、根据计算最优值时得到的信息,构造最优解代码演示#include <iostream>using name原创 2020-12-18 16:33:21 · 69 阅读 · 1 评论 -
矩阵连乘之动态规划
矩阵连乘问题描述:给定n个矩阵{A1,A2,…,An},其中,Ai与Ai+1是可乘的,(i=1,2 ,…,n-1)。用加括号的方法表示矩阵连乘的次序,不同的计算次序计算量(乘法次数)是不同的,找出一种加括号的方法,使得矩阵连乘的次数最小。比如说:A0(5 10),A1(10 100),A2(100 2)不同条件下:(A0 A1)A2 => 5*10*100+5*100*2=6000A0(A1 A2) => 10*100*2+5*10*2=2100问题分析首先矩阵满足结合性,原创 2020-12-18 13:45:24 · 328 阅读 · 0 评论 -
最大连续上升子序列之动态规划
动态规划之C语言问题:输入一组数据,找出其中最大连续上升子序列长度输出最大连续上升子序列长度打印该子序列12 15 10 18 20 8 16 14 24 18思路采用动态规划的思想,利用一个以为数组s[i]记录原数组中对应位置的最大连续上升子序列的长度比如说:12 15 10 18 20 8 16 14 24 181 2 1 2 3 1 2 1 2 1分别有的连续上升子序列:12 15 ; 10 18 20 ; 8 16 ;14 24;18也就是将原创 2020-12-16 13:26:59 · 414 阅读 · 0 评论 -
0-1背包之动态规划(附演示动画)
0-1背包之C语言01背包问题应该算是一个很经典的问题了,接下来实现一下问题:现给出一个容量为V的背包和N件物品,每件物品的体积为v[i],价值为c[i],将几件物品装入背包内,使得物品总体积不超过背包体积,并且使总价值最大,求这个最大值?给出一组数据:V = 8,N = 4;i 1 2 3 4v 2 3 4 5c 3 4 5 6解题思路:用 f[i][j] 表示前 i 种物品,背包容量为 j 时的最大价值首先初始化数组 f[][]当 i=1 时,如果背包可以原创 2020-12-16 01:57:54 · 640 阅读 · 0 评论 -
最大子段和之分治法
最大子段和之C语言问题描述:给定一个数组,找出其中可以构成最大数的子段,需要注意的是,这个不同于最大子序列求和—— 最大字段求和:字段必须是连续的—— 最大子序列求和:子序列只要是包含在原来的序列中即可举个例子:-1 4 -3 1 5 -1 4 -5 2求上述的数组中的最大字段和,不难得知,最大子段和就是 10 ,也就是子段 4 -3 1 5 -1 4思路:首先,枚举?没有枚举解决不了的问题好吧。但是真的枚举么?在时间和空间复杂度上都会有很大的消耗;分治?该怎么分治呢?由于在一个子段中原创 2020-12-09 16:41:37 · 4974 阅读 · 2 评论 -
快速排序之随机快排
随机快排之C语言问题:快速排序大家应该都比较了解了,利用分治法的思想,将原有的数据分成两个部分,递归分治排序。大致有 4 个步骤:首先设定一个分界值,通过该分界值将数组分成左右两部分。将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以原创 2020-12-09 13:13:56 · 2227 阅读 · 0 评论 -
棋盘覆盖问题,看完这个就好
棋盘覆盖(C语言)问题描述:如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。k>0时,可将2k×2k的棋盘划分为4个2(k-1)×2(k-1)的子棋盘,如图(a)所示。这样划分后,由于原棋盘只有一个特殊方格,所以,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。为了将这3个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个L型骨牌覆盖这3原创 2020-12-09 01:45:32 · 839 阅读 · 0 评论 -
稳定匹配问题(脱单就靠这波了)
稳定匹配问题之三国首先,我们先看看问题:有n个男人和n个女人(n>=2),每个男人对所有女人有一个好感度排名,每个女人对所有男人也有一个好感度排名。将男女两两配对,得到n对男女,称之为一个完美匹配。如果有一组男女A和B,他们在匹配中没有被配对,且对对方的好感度均大于对现有配偶的好感度(男人A觉得女人B好过现在的妻子C,女人B觉得A好过现在的丈夫D),则称之为一个不稳定配对。如果一个完美匹配中没有不稳定配对,则称改匹配为一个稳定匹配。|左图是男对女的好感度,右图是女对男的好感度思路:首先,拿原创 2020-12-09 01:25:31 · 1060 阅读 · 0 评论 -
整数划分实现列项打印
整数划分整数划分:将一个正整数 n 划分成多个大于等于 1 的整数。举个例子,比如说 665+14+2,4+1+13+3,3+2+1,3+1+1+12+2+2,2+2+1+1,2+1+1+1+11+1+1+1+1+1也就是说,6 可以划分成 11 种相加的形式接下来,分析一下本题假设函数 F(n,m) , 其中 n 是需要被划分的整数,m 是划分的加数中的最大数按照这个关系,进行递推当 n = 1,m = 1 时,也就是说此时只有一个数也就是 1,相当于递归出口当 n <原创 2020-12-09 01:00:30 · 477 阅读 · 0 评论 -
C语言中指针与取地址符&详解
关于指针与取地址符1.什么是指针?(1)首先,我们要明白什么叫做指针变量名,对于 int *p,这里的指针变量名不是 p 而是 p ,类似与 Java 中定义数组是 int [] array ,所以我习惯将 p 叫做 int * 类型(2)通俗的来说:指针就是地址,通过这段地址就可以找到以它为地址的那个内存单元【保存地址使用的就是指针变量,所以是用变量名p=&a,而不是p = &a...原创 2019-10-31 23:35:04 · 15523 阅读 · 10 评论 -
C语言函数实现两个数的交换、指针操作
用函数实现属的交换#include<stdio.h>void swap(int x,int y) //这个时候传递的就是值{ int t; t = x; x = y; y = t; //值交换 printf("a = %d\n",x); printf("b = %d\n",y);}int main(){ ...原创 2020-09-27 11:34:16 · 2980 阅读 · 0 评论 -
算法题(母牛的故事、汉诺塔、进制转换)
母牛的故事这是去年我们集训的时候写的题,想想还是记得当时是怎么错的,奈何语文还是有限个人理解关于算法题,我觉得主要还是在于理解上首先,是有一头母牛,母牛每年生一头小牛,也就是说,在前三年分别每年是1头,2头,3头但是在第四年之后,情况开始发生变化,小牛长大了也可以生小牛了,假设之后n年有f(n)头牛,那么f(n)=f(n-1)+f(n-3),意思就是前一年的小牛的数量f(n-1),加上在这一年刚出生小牛的数量f(n-3)【三年前的牛开始生小牛】#include <stdio.h>原创 2020-09-26 11:05:07 · 407 阅读 · 0 评论