首页 > 编程语言 >子序列相关算法

子序列相关算法

时间:2023-10-24 09:01:12浏览次数:35  
标签:int mid maxleftbordersum 102 算法 leftbordersum 序列 相关 left

1、最长公共子序列

最长公共子序列(Longest Common Subsequence,LCS)是动态规划中的经典问题,顾名思义,即求两个序列最长的公共子序列(可以不连续)。

 

 1 #include <iostream>
 2 #include<string>
 3 using namespace std;
  //使用动态规划算法;分为两种情况 4 char a[102],b[102]; 5 int dp[102][102]; 6 int main() 7 { 8 string s1,s2; 9 cin>>s1>>s2; 10 for(int i=0;i<s1.size();i++) 11 { 12 a[i+1]=s1[i]; 13 } 14 for(int i=0;i<s2.size();i++) 15 { 16 b[i+1]=s2[i]; 17 } 18 19 for(int i=1;i<=s2.size();i++) 20 { 21 for(int j=1;j<=s1.size();j++) 22 { 23 if(b[i]==a[j]) 24 { 25 dp[i][j]=dp[i-1][j-1]+1;//最后一个字母相等 26 } 27 else 28 { 29 dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 30 } 31 } 32 } 33 cout<<dp[s2.size()][s1.size()]<<endl; 34 35 return 0; 36 }

2、最长连续子序列的和(分治法)

首先递归的进行对左右两边进行划分(直到只剩下一个元素,然后进行合并、比较)。有三种情况:1.最大值在左边;2.最大值在右边;3.最大值横跨左右两边;

 

 1 #include <iostream>
 2 using namespace std;
 3 int a[102];
 4 int maxsubsum(int left,int right)
 5 {
 6     int i,j;
 7     int maxleftsum,maxrightsum;
 8     int maxleftbordersum,leftbordersum;
 9     int maxrightbordersum,rightbordersum;
10     if(left==right)
11     {
12         if(a[left]>=0)
13         {
14             return a[left];
15         }
16         else
17         {
18             return 0;
19         }
20     }
21     int mid=(left+right)/2;
22     maxleftsum=maxsubsum(left,mid);
23     maxrightsum=maxsubsum(mid+1,right);
24     maxleftbordersum=0,leftbordersum=0;
25     for(int i=mid;i>=left;i--)
26     {
27         leftbordersum+=a[i];
28         if(leftbordersum>maxleftbordersum)
29         {
30             maxleftbordersum=leftbordersum;
31         }
32     }
33     maxrightbordersum=0,rightbordersum=0;
34     for(int i=mid+1;i<=right;i++)
35     {
36         rightbordersum+=a[i];
37         if(rightbordersum>maxrightbordersum)
38         {
39             maxrightbordersum=rightbordersum;
40         }
41     }
42     return max(max(maxleftsum,maxrightsum),maxleftbordersum+maxrightbordersum);
43 }
44 int main()
45 {
46     int res;
47     int n;
48     cin>>n;
49     for(int i=0;i<n;i++)
50     {
51         cin>>a[i];
52     }
53     res=maxsubsum(0,n-1);
54     cout<<res;
55     return 0;
56 }

 

标签:int,mid,maxleftbordersum,102,算法,leftbordersum,序列,相关,left
From: https://www.cnblogs.com/zlgwzy/p/17557029.html

相关文章

  • md5算法实现
    前言md5算法是我们经常会用到的一个hash函数,虽然已经被证明是不安全的了,但其应用依然十分广泛.哈希函数具有如下特点:将任意长度的字符串映射为固定长度源数据微小的改动会导致结果差异巨大不可逆暴力破解困难你有没有好奇过,哈希函数是如何做到这些的呢?本文就拿m......
  • 自己找教学场景相关github目标识别代码研读(10.21~10.28)
    任务:1、解决上次老师问的一些问题?(1)上次老师提到F1得分,再总结一下:混淆矩阵TP:预测正例,实际正例(预测对)FN:预测负例,实际正例(预测错)FP:预测正例,实际负例(预测错)TN:预测负例,实际负例(预测对)精确率=TP/(TP+FP):预测为正例的那些数据里预测正确的数据个数(预测为正例的有多少预测对......
  • IO流,对象流,将对象序列化到文件中,将对象反序列化到内存中
    一一一、序列化!!一、首先创建一个对象类,实现Serializable标记接口 对象中,实现了接口,三个私有属性,并且创建了无参有参构造,get和set方法和toString方法 (一个标准的对象模型)二、序列化到外部文件 结果: 也是一堆乱码,还是因为用字节输出的原因。 二二二、反序列化! 结......
  • 300. 最长递增子序列
    链接https://leetcode.cn/problems/longest-increasing-subsequence/description/思路经典DP题目。我们用dp[i]代表了第i个元素为最终子序列长度的最长递增子序列的长度。总体思想就是,对于某个子序列i,去遍历它前面的dp[0~i-1],看看满足条件的dp[0~i-1]中最长的是哪个。所以状......
  • diff算法
    什么是Diff算法?Diff算法是Vue.js的一个核心特性,它是一种用于比较虚拟DOM树的差异,并最小化DOM操作的数量。当Vue.js检测到数据更改时,它会生成一个新的虚拟DOM树,并将其与旧虚拟DOM树进行比较。Diff算法会查找差异,并仅对需要更改的部分进行DOM操作。这种算法可以帮助我们在前端开发中......
  • 无涯教程-Clojure - 序列
    序列是在"seq"命令的帮助下创建的。以下是一个简单的序列创建示例。(nsclojure.examples.example(:gen-class));;ThisprogramdisplaysHelloLearnfk(defnExample[](println(seq[123])))(Example)上面的程序产生以下输出。(123)以下是可用于序列的......
  • 算法笔记(3)模拟退火
    原发表于个人博客=模拟退火的引入假如我们有一个函数,要求它的极大值,怎么求呢?如果这个函数满足单调性,可以用二分的方法。如果这是一个单谷(或单峰)函数,可以用三分法。那要是多峰函数怎么半呢?这时就可以用随机化算法。一种朴素的方法是:每次在当前找到的最优方案\(x\)附近寻找一......
  • 算法笔记(4)莫队算法入门
    原发表于我的博客前言本来想学完回滚莫队、树上莫队、二离莫队之后一起写一个博客,但是一直学不会/kk,只好把已会的普通莫队和带修莫队写了(以后会补上的)普通莫队莫队——优雅的暴力莫队算法的引入例题:给定一个数列和若干询问,每次询问询问一段区间内不同种类数字的个数。暴力......
  • 算法笔记(5)贪心算法
    原发表于我的博客贪心算法贪心与其说是一种算法,不如说一种思想。贪心思想,顾名思义,就是总是做出当前最好的选择,这种方式可能在全局上不是最好的结果,但是在一些题目中就可以直接用。最简单的例子就是“货比三家”,在生活中,我们买东西时都会挑性价比最优的,这就是一种贪心。贪心算......
  • 算法笔记(6)数列分块
    原发表于我的博客前言分块不能说是一种数据结构,它是一种思想,无论是数列分块,块状链表,还是数论分块,莫队算法,都应用了分块的思想。本文主要介绍狭义上的分块,即数列分块。数列分块的引入数列分块可以说是暴力,一种优美的暴力,它的基本思路是,把数列分成若干块(一般取\(\sqrtn\)),分块......