首页 > 动态规划整理

动态规划整理

1.最长连续序列。比如  abccccfa,最长连续序列为cccc,长度为4

思路:另开一个数组记录到目前位置最长连续序列长度。每个位置的字符(除第一个)和前一个比较,相同+1,不同标为1

图示:

代码:

#include 
#include <string.h>
int main()
{char s[10] = "abccccfa";int num[10] = { 0};char tmp;int maxpos, maxval, i;num [0] = 1;maxpos = 0;tmp = s[0];for(i = 1; i ){if (s[i] == tmp)num[i] = num[i-1] + 1;elsenum[i] = 1;if(num[i] > num[maxpos])maxpos = i;tmp = s[i];}printf("maxlen:%d***maxchar:%c
", num[maxpos], s[maxpos]);return 0;
}

结果:

分析: 空间复杂度:O(n)  时间复杂度:O(n)

同思路问题:

(1)求一字母序列的最长连续上升序列的长度(比如abcffgmnE,abc长为3)

    思路:构造一同样大小的数组来记录到目前为止的最长连续序列的长度。在确定该位置的长度是,和前一个比较,如果ascii吗相减为1,那么在上一个长度的基础上+1;否则直接赋值1。

(2)求数字序列的最长连续上升序列的和(比如34123480,1234和为10)

    思路:构造一同样大小的数组来记录到目前为止的最长连续序列的和。在确定该位置的和是,和前一个比较,如果相差1,那么在上一个和的基础上+该位置原数组的值;否则直接复制该位置原数组的值。

(3)数列中最大连续元素之和(比如:3 -2 5 1 -10,最大元素之和为7(3 -2 5 1))

int MaxSubSum(int *arr,int n)
{int tmp = 0;int MAX = arr[0];for(int i = 0 ; i < n ; i++){tmp += arr[i];if(tmp < 0){tmp = 0;}if(MAX < tmp){MAX = tmp;}}return MAX;
View Code

 

2.最大上升序列的长度 (如:“amnpabpzjoq” 的最大上升序列 为:"amnpz" 长度为5)

图示:

代码:

#include 
#include 
int main()
{char s[] = "amnpabpzjoq";int num[100] = {0};int maxnum, i, j;for(i = 0; i < strlen(s); i++){maxnum = -1;for(j = i-1; j >=0; j--){if (s[i] > s[j] && num[j] > maxnum)maxnum = num[j];}if (maxnum == -1)num[i] = 1;elsenum[i] = maxnum + 1;}maxnum = num[0];for (i = 1; i < strlen(s); i++){printf("%d
", num[i]);if (num[i] > maxnum)maxnum = num[i];}printf("maxlen:%d
", maxnum);
}

结果:

  3. 编辑距离

定义:字符串a只能通过“替换、插入、删除”三种操作得到字符串b,期间所做操作的次数。

例如:abc ——> cb,编辑距离为2。执行的操作:a替换为c,删除字符c.

思路:二维数组记录到字符a的m位置和字符串b的n位置,编辑距离f(m, n)。

       f(m, n) = min(f(m-1, n)+1, f(m, n-1)+1, f(m-1, n-1)+same(m, n)), 其中same(m,n)指字符串a的第m个字符是否等于字符串b的第n个字符,等为0,否则为1.

注意: 空和字串的相似程度时,距离为别的字串的长度!

图示:

代码:

#include 
#include <string.h>
int minvalue(int a, int b, int c)
{int min = a > b ? b : a;min = min > c ? c : min;return min;
}
int same(int a, int b)
{if (a != b)return 1;else return 0;
}
int main()
{char a[] = "bca";char b[] = "abc";int lena = strlen(a);int lenb = strlen(b);int c[lena+1][lenb+1], i, j;for(i=0; i <= lena; i++)c[i][0] = i;    for(i=0; i <= lenb; i++)c[0][i] = i;for(i = 1; i <= lena; i++)for(j=1; j <= lenb; j++)c[i][j] = minvalue(c[i-1][j]+1, c[i][j-1]+1, (c[i-1][j-1]+same(a[i], b[j])));for(i=0; i <= lena; i++){for(j=0; j <= lenb; j++)printf("%d	", c[i][j]);printf("
");}printf("Lavenshtein distance:%d
", c[lena][lenb]); return 0;
}

执行结果

同思路问题

1.最长公共子序列:详见:http://www.cnblogs.com/kaituorensheng/archive/2013/03/31/2992319

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 注意: num 的长度小于 10002 且 ≥ k。 num 不会包含任何前导零。 示例 1 : 输入: num = “1432219”, k = 3 输出: “1219” 解释: 移除掉三个数字 4, 3, 和 2形成一个新的最小的数...

  • 代码展示:   http://paste.ubuntu.com/23693598/ #include #include #include char * largeDiffer(char *a,char *b){ /*  使用说明 传入的a和b只能为整数 结果为a-b;返回...

  • Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of Ch...

  • /*Name: NYOJ--811--变态最大值Author: shen_渊 Date: 17/04/17 15:49Description: 看到博客上这道题浏览量最高,原来的代码就看不下去了 o(╯□╰)o */#include #include #include u...

  • 生成唯一号:思路,根据yymmddhhmmss+自增长号+唯一服务器号( SystemNo)生成唯一码,总长度19,例如:1509281204550000101. public class UniqueNumber {     private static long num = 0;//流水号     private sta...

  • 用python编写乘法口诀表的方法 发布时间:2020-08-25 11:46:35 来源:亿速云 阅读:60 作者:小新 用python编写乘法口诀表的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧! 第一种:使用for遍历循环嵌套for x in...

  • //很长一段时间我都只使用以下方式做数组循环,具体原因看数据 var aa = for (var i = 0, l = aa.length; i < l; i++) { var a = aa[i];} 数据采集图片来源于网友 很明显,for循环第二种方式完胜!!! 至于for in、forEach什么的,不知道甩他们多少...

  • 目录 1. Scene Graph Generation with External Knowledge and Image Reconstruction 2. Knowledge Acquisition for Visual Question Answering via Iterative Querying Author...

  • 基础题1: 输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素,如果方阵a中的所有元素都沿主对角线对称,输出“Yes”, 否则,输出“No”。主对角线为从矩阵的左上角至右下角的连线,方阵a中的所有元素都沿主对角线对称指对所有i, k,a[i][k]和a[k][i]相等。输入输出示例如下: 输入: 3 1 2 3 4 5 6 7...

  • 程序流程控制 分支 顺序 循环 if switch&case 1 2 3 调整 break 1.6 前 switch(byte、short、char、int) 1.7 可放String 循环 while(次数不确定) do while for(确定次数) break(跳出本层循环) continue(跳出本次循环)     *   2...