最长公共子序列(lcs)算法是一种非常基础的算法,其主要作用是找出两个序列中的最长公共子序列,但这个算法似乎只找到了两个序列最长公共子序列里边元素的个数,并没有具体的把最长公共子序列求出来,例如s1为123456,s2为124678,他们的最长公共子序列时1246,但lcs似乎只能返回子序列1246里边的元素个数 4 ,并没有返回子序列;

代码为:

#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b
char c[500],s[500];
int dp[500][500],i,n,m,j;
int main()
{while(scanf("%s%s",c,s)!=EOF){int len=strlen(c);int lem=strlen(s);memset(dp,0,sizeof(dp));//清零dp数组 for(i=0;i<len;i++)for(j=0;j<lem;j++){if(s[j]==c[i]){dp[i+1][j+1]=dp[i][j]+1;//运用动态规划,假如找到了是s[j]==c[i] ,则值+1; }elsedp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);//假如没有找到 ,则在 (dp[i+1][j],dp[i][j+1])里找较大者进行下一轮比较 }printf("%d\n",dp[len][lem]);}return 0;
}

最大子段和即为数组里边选取相邻的一段元素,使其和最大,输出最大和,运用了动态规划的思想;下边我贴两个代码,一个是单纯的找到了最大子段和,另一个是找到最大子段和,并找到最大子段和在数组的首尾地址;

查找最大子段和:

#include<stdio.h>
#include<string.h>
int a[1000];
int max(int n)
{int sum=0;int b=0;for(int i=1;i<=n;i++){if(b>0)b=b+a[i];//当b小于0时,则从下一个记录,当b大于0时继续更新, elseb=a[i];if(b>sum)//储存每一次更新时当前最优解的值,并判断 是否为最终最优解; sum=b;}return sum;
}
int main()
{int i,n;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++)scanf("%d",&a[i]);int l=max(n);printf("%d\n",l);}return 0;
}

查找最大子段和,并返回其在数组中的首位地址:

#include<stdio.h>
int a[1010];
void max(int n,int besti,int bestj)//计算最大 子段和
{int sum=0;//最优解 int begin=0;int b=0;//当前最优解 for(int i=1;i<=n;i++){if(b>0)b=b+a[i];else{b=a[i];begin=i;//记录当前最优解开始的地址 }if(b>sum){sum=b;besti=begin;bestj=i;//i一直在变,begini 可能不变,直到更新了最优解,记录最优解的尾地址. }}printf("%d 左侧地址是:%d右侧地址是:%d\n",sum,besti,bestj);
}
int main()
{int i,n;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++)scanf("%d",&a[i]);max(n,0,0);}return 0;
}

附测试结果:

LCS 最大子段和,最大子段和在原数组的首末地址相关推荐

  1. 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+ ...

  2. 【leetcode】644 最大子段和 II(二分查找,数组)

    题目链接:https://leetcode-cn.com/problems/maximum-average-subarray-ii/ 题目描述 给定一个包含 n 个整数的数组,找到最大平均值的连续子序 ...

  3. codevs 3981 动态最大子段和(线段树)

    题目传送门:codevs 3981 动态最大子段和 题目描述 Description 题目还是简单一点好... 有n个数,a[1]到a[n]. 接下来q次查询,每次动态指定两个数l,r,求a[l]到a ...

  4. POJ - 2018 Best Cow Fences(二分+最长连续子段和)

    题目链接:点击查看 题目大意:给出n个正整数,求一个平均数最大的.长度不小于L的连续子段 题目分析:因为这个题目的答案满足二分的性质,也就是若二分的平均数小于答案,则更小的平均数肯定都满足答案(因为这 ...

  5. 最大子段和问题Java实现

    最大子段和问题 一.问题描述 给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+-+a[j]和最大. 例如(-2,11,-4,13,-5,2)的最大子段和为 ...

  6. 1191. K 次串联后最大子数组之和(最大子段和变形)

    给你一个整数数组 arr 和一个整数 k. 首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次. 举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2 ...

  7. 洛谷 P1115 最大子段和

    [题目链接] 洛谷 P1115 最大子段和 [题目考点] 1. 动态规划:线性动规 最大子段和 [解题思路] 解法1:线性动规 子段或子串指的是序列中连续的多个元素,子序列是指序列中可以不连续的多个元 ...

  8. codevs 3981 动态最大子段和

    3981 动态最大子段和 http://codevs.cn/problem/3981/  题目等级 : 钻石 Diamond 题目描述 Description 题目还是简单一点好... 有n个数,a[ ...

  9. HAUT校赛--最大奇子段和

    问题 G: 最大子段和 时间限制: 1 秒  内存限制: 64 MB 提交: 42  解决: 10 提交 状态 题目描述 一个大小为n的数组a1到an(−10^4≤ai≤10^4).请你找出一个连续子 ...

最新文章

  1. Mysql默认密码的查找和修改
  2. sharding jdbc:分库、分表;读写分离;
  3. 字符设备驱动基本流程
  4. LiveRTMP 之RTMP直播高效推送缓冲区
  5. 从读大学到工作,我的这几年时光是如何度过的
  6. 电脑卡在正在启动windows界面_让 Linux 启动更快
  7. 2020年中国餐饮配送机器人行业研究报告
  8. 树莓派文字转语音 python_树莓派3-语音-实现文字转语音服务
  9. LeetCode 633. Sum of Square Numbers
  10. 高等数学(七)- 多元函数微分学(2)【多元函数极值问题】
  11. vue安装axios以及如何使用axios
  12. 如何卸载赛门铁克symantec,ivanti
  13. linux下安装五笔输入法,Linux五笔输入法:小小输入法安装配置
  14. 早晨随笔_早上如何调试
  15. 101107 ~101113
  16. html5倒计时效果,html5+css3进度条倒计时动画特效代码【推荐】
  17. tomcat 配置域名和ssl证书
  18. 杭电oj 2081 手机短号(C++)
  19. An error occurred while filtering resources
  20. Redis非关系型数据库(三)持久化

热门文章

  1. Python风格总结:日期操作
  2. VC 运行时库 /MD、/MDd 和 /MT、/MTd
  3. 吴恩达深度学习1.3练习_Neural Networks and Deep Learning
  4. 最受白领欢迎的12大办公软件
  5. HP 380 G5安装CentOS7时找不到P400 raid卡
  6. CSS-滤镜 -webkit-filter
  7. sql自动审核工具-inception
  8. DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)...
  9. 「SF图片上传不清晰」解决方案
  10. Bash漏洞引发僵尸网络狂欢