博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求数组的最大子数组值和最长公共子序列问题
阅读量:6070 次
发布时间:2019-06-20

本文共 1399 字,大约阅读时间需要 4 分钟。

#include 
#include
using namespace std;/*求数组的子数组和的最大值分析:子数组是连续的,只用返回子数组的和,元素肯定是整数,包括正数,负数,0假设 sum存储的是数组从0第i个位置的最大子数组之和,那么第i+1个元素加入后的结果 temp = max(temp+a[i+1],a[i+1]); sum = max(sum,temp);(sum中始终存着最大和)*/int max(int a,int b){ return a>b?a:b;}int maxSum(int *arr,int n){ int temp = arr[0]; int sum = arr[0]; for (int i = 1; i < n; i++) { temp = max(temp+arr[i],arr[i]); sum = max(sum,temp); } return sum;}//最长递增、递减子序列,这里以递增子序列为例,递减子序列可以转化为递增子序列计算/*设以 len[]数组存储 以每一个元素结尾的递增子序列的最大长度,没增加一个元素,更新len[0---i]len[i] = max{1,len[k]+1} a[i]>a[k] k:[0 i-1];该方法的效率为O(N^2)*/int LIS(int *arr,int n){ int *len = (int*)malloc(sizeof(int)*n); if (len==NULL)return -1; memset(len,0,n); for(int i = 0; i < n; i++) { len[i] = 1; for (int k = 0; k < i; k++) { if (arr[i] > arr[k] && len[k]+1 > len[i]) len[i] = len[k]+1; } } int max=len[0]; for (int i = 0; i < n; i++) if(len[i]>max)max = len[i]; free(len); return max;}int main(int argc, char **argv){
int a[] = {
1,-1,2,-3,4,-5,6,-7}; int size; int i; size = sizeof(a)/sizeof(int); int res = maxSum(a,size); printf("最大子数组之和为:%d\n",res); printf("最长递增子序列:%d\n",LIS(a,size)); return 0;}

 

本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/p/3955570.html ,如需转载请自行联系原作者

你可能感兴趣的文章
笔记本搜索不到某一AP广播的SSID,信道的原因
查看>>
基于Spring MVC的异常处理及日志管理
查看>>
MediaBrowserService 音乐播放项目《IT蓝豹》
查看>>
MySQL入门12-数据类型
查看>>
Windows Azure 保留已存在的虚拟网络外网IP(云服务)
查看>>
修改字符集
查看>>
HackTheGame 攻略 - 第四关
查看>>
js删除数组元素
查看>>
带空格文件名的处理(find xargs grep ..etc)
查看>>
华为Access、Hybrid和Trunk的区别和设置
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>
关于HTML5的理解
查看>>
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
dom4j解析xml文件
查看>>
第六周
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>