最长重复子数组,最大子序和,最长公共子序列

2024-04-12 21:44

本文主要是介绍最长重复子数组,最大子序和,最长公共子序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三种类似动态规划对比

#include<bits/stdc++.h>
using namespace std;
class Solution{public:int againMax(vector<int>& num1,vector<int>& num2){vector<vector<int> > dp(num1.size()+1,vector<int>(num2.size()+1,0));//二维数组初始化为0 int result=0;//用来放最大值 for(int i=1;i<=num1.size();i++){for(int j=1;j<=num2.size();j++){if(num1[i-1]==num2[j-1]){//每个数组多放一个,第一位为空不动它 dp[i][j]=dp[i-1][j-1]+1;}if(result<dp[i][j]) result=dp[i][j];}}return result;}int maxSum(vector<int>& num){vector<int> dp(num.size());dp[0]=num[0];//初始化第一个dp就是第一个数组的值,result也是 int result=dp[0];for(int i=1;i<num.size();i++){dp[i]=max(dp[i-1]+num[i],num[i]);//状态转移方程,继续加大还是当前这个元素大 if(result<dp[i]) result=dp[i];}return result;}int maxPub(string s1,string s2){vector<vector<int> > dp(s1.size()+1,vector<int>(s2.size()+1,0));//二维数组初始化为0 for(int i=1;i<=s1.size();i++){for(int j=1;j<=s2.size();j++){if(s1[i-1]==s2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}}return dp[s1.size()][s2.size()];}
};
int main(){Solution solution;vector<int> num1;vector<int> num2;int n,m;cin>>n>>m;for(int i=0;i<n;i++){int n1;cin>>n1;num1.push_back(n1);}for(int j=0;j<m;j++){int n2;cin>>n2;num2.push_back(n2);}int result1=solution.againMax(num1,num2);int result2=solution.maxSum(num1);cout<<result1<<" "<<result2;string s1,s2;cin>>s1>>s2;cout<<solution.maxPub(s1,s2);
}

欢迎批评指正!

这篇关于最长重复子数组,最大子序和,最长公共子序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898322

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect