算法-最长子序列和C/C++实现(三个复杂度)
最长子序列和的问题非常easy:
就是一个数组,求出当中当中连续的某一段和,而这一段和是全部的连续段和的最大的值。求出这个值。
先说复杂度最高的:O(n3)
直接上代码,非常easy的:
//
// main.cpp
// SumSequence
//
// Created by Alps on 14-7-23.
// Copyright (c) 2014年 chen. All rights reserved.
// #include <iostream>
using namespace std; int MaxSubsequenceSum(const int A[], int N){
int ThisSum, MaxSum, i, j, k;
MaxSum = 0;
for(i = 0; i < N; i++){
for(j = i; j < N; j++){
ThisSum = 0;
for (k = i; k < j; k++) {
ThisSum += A[k];
}
MaxSum = ThisSum > MaxSum ? ThisSum: MaxSum;
}
}
return MaxSum;
} int main(int argc, const char * argv[])
{ int A[] = {1, 2, -5, 2, 5, 1, 8, -4};
int N = sizeof(A)/sizeof(int);
// printf("%d\n",N);
int MaxSum = MaxSubsequenceSum(A, N);
printf("%d\n",MaxSum);
return 0;
}
这个事实上非常easy,第一层for循环是i从头開始遍历。第二层for是j从i遍历到尾。第三层就是算i到j的这一段的和。
时间复杂度是O(n3).
以下说一个O(n2)的:
代码例如以下:
//
// main.cpp
// SumSequencen2
//
// Created by Alps on 14-7-23.
// Copyright (c) 2014年 chen. All rights reserved.
// #include <iostream>
using namespace std; int MaxSubSequenceSum(const int A[], int N){
int MaxSum, ThisSum, i, j;
MaxSum = 0;
for (i = 0; i < N; i++) {
ThisSum = 0;
for (j = i; j < N; j++) {
ThisSum += A[j];
MaxSum = MaxSum > ThisSum ? MaxSum : ThisSum;
}
}
return MaxSum;
} int main(int argc, const char * argv[])
{
int A[] = {1, 2, -5, 2, 5, 1, 8, -4};
int N = sizeof(A)/sizeof(int);
// printf("%d\n",N);
int MaxSum = MaxSubSequenceSum(A, N);
printf("%d\n",MaxSum); return 0;
}
这个也比較好理解,第一层循环就是i从头到尾遍历,第二层循环是j从i遍历到尾,在遍历过程中不断检測ThisSum的大小,取Max(ThisSum, MaxSum)的数,并赋值给MaxSum,这样就能够知道MaxSum是多少了~
另一个方法复杂度是O(nlogn)可是这个算法比較麻烦,代码也比較麻烦,我这里没有写~想学的能够去《数据结构与算法分析》来学习。
这里有一个O(n)级别的算法来解决问题!!!:请看代码:
//
// main.cpp
// SumSequencen
//
// Created by Alps on 14-7-23.
// Copyright (c) 2014年 chen. All rights reserved.
// #include <iostream> using namespace std; int MaxSubSequenceSum(const int A[], int N){
int MaxSum, ThisSum, i;
MaxSum = A[0];
ThisSum = 0;
for (i = 0; i < N; i++) {
ThisSum += A[i];
MaxSum = ThisSum > MaxSum ? ThisSum: MaxSum;
if (ThisSum < 0) {
ThisSum = 0;
continue;
}
}
return MaxSum;
} int main(int argc, const char * argv[])
{
int A[] = {1, 2, -5, 2, 5, 1, 8, -4};
int N = sizeof(A)/sizeof(int);
// printf("%d\n",N);
int MaxSum = MaxSubSequenceSum(A, N);
printf("%d\n",MaxSum);
return 0;
}
O(n)级别的这类算法算是比較完美的算法了。我对这个算法的理解就是,在一个数组里,有非常多非常多段,这些段都有一个和,最小的段是一个元素,而最大的序列和肯定是一个段,或者是两个段的和,和就是加上一个正数就变大,所以当一个段是负数的时候,我就直接抛弃掉了~(除非全部都是负数,就找一个最大的。)
所以就有了上面的算法。。不懂的请留言~
算法-最长子序列和C/C++实现(三个复杂度)的更多相关文章
- nyoj 17-单调递增最长子序列 && poj 2533(动态规划,演算法)
17-单调递增最长子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:21 submit:49 题目描述: 求一个字符串的最长递增子序列的长度 如 ...
- 算法:Common Subsequence(动态规划 Java 最长子序列)
Description A subsequence of a given sequence is the given sequence with some elements (possible non ...
- 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
一, 最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...
- HDU 1513 最长子序列
Palindrome Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 4123 (2011 Asia FZU contest)(树形DP + 维护最长子序列)(bfs + 尺取法)
题意:告诉一张带权图,不存在环,存下每个点能够到的最大的距离,就是一个长度为n的序列,然后求出最大值-最小值不大于Q的最长子序列的长度. 做法1:两步,第一步是根据图计算出这个序列,大姐头用了树形DP ...
- 【LCS,LIS】最长公共子序列、单调递增最长子序列
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 ...
- nyoj 17 单调递增最长子序列
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 ...
- NYOJ17,单调递增最长子序列
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf.长度为4 输入 第 ...
- 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率
隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...
随机推荐
- eclipse @ 注释为何一写就报错
以前一直奇怪,为什么eclipse自动生成的的代码中的@注释不会报错,而我直接写@就会报错 原因其实很简单: eclipse会检查@注释的位置 举个例子:写@Override,直接写会报错,但如果你继 ...
- 关于 firefox 无法在 passport.csdn.net 找到该服务器
很奇怪的现象:用firefox上网,某些网站打开总是会提示 无法在XXX找到该服务器.但是使用其他浏览器,比如360却可以正常打开. 我已经将firefox加入了防火墙的信任列表,但是仍旧是这样. 而 ...
- BeanUtils数据封装与表单JavaBean
一.BeanUtils工具的解释 (1)Apache的Commons组件中.提供了一个实用的工具类BeanUtils,利用它可以方便的将表单数据值填充值Bean中: (2)javax.servlet. ...
- 【Oracle】不安装Oracle客户端直接用PL/SQL连接数据库
1.下载 instantclient_11_2.zip PL/SQL2.解压instantclient_11_2.zip到相应文件夹,比如:E:\oracleclient\instantclient_ ...
- Python获取并修改hosts
#!/usr/bin/env python #-*- coding: utf-8 -*- #谷歌host修改脚本 #author 坤子<root#pythonpy.com> #date 0 ...
- ZOJ 2794 Just Pour the Water 【矩阵快速幂】
给你n个杯子,每次有特定的到水规则,倒m次请问最后每个被子里还有多少水 我们很容易发现每次变化的规则相同,那么可以set 一个矩阵存放 然后多次倒水就相当于矩阵相乘,在m 范围达到(1<= M ...
- JavaScript自调用匿名函数
Self-Invoking Anonymous Function,即自调用匿名函数.顾名思义,该函数没有名称,不同的是,该函数定义后立即被调用.该函数的作用是在应用中初始化或做一次性工作. 普通匿名函 ...
- php 登陆动作详解
<?php class LoginAction extends Action { function index(){ $this->display(); } function do_log ...
- 设计模式(八)装饰器模式Decorator(结构型)
设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...
- WM_PAINT消息小结
WM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. 1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送WM_PAINT消息:当第 ...