1.最长连续序列。比如  abccccfa,最长连续序列为cccc,长度为4

思路:另开一个数组记录到目前位置最长连续序列长度。每个位置的字符(除第一个)和前一个比较,相同+1,不同标为1

图示:

动态规划整理

代码:

#include <stdio.h>
#include <string.h>
int main()
{
    char s[10] = "abccccfa";
    int num[10] = {0};
    char tmp;
    int maxpos, maxval, i;

    num [0] = 1;
    maxpos = 0;
    tmp = s[0];
    for(i = 1; i <strlen(s); i++)
    {
        if (s[i] == tmp)
            num[i] = num[i-1] + 1;
        else
            num[i] = 1;
        if(num[i] > num[maxpos])
            maxpos = i;
        tmp = s[i];
    }
    printf("maxlen:%d***maxchar:%c\n", num[maxpos], s[maxpos]);
    return 0;
}

结果:

动态规划整理

分析: 空间复杂度:O(n)  时间复杂度:O(n)

同思路问题:

(1)求一字母序列的最长连续上升序列的长度(比如abcffgmnE,abc长为3)

    思路:构造一同样大小的数组来记录到目前为止的最长连续序列的长度。在确定该位置的长度是,和前一个比较,如果ascii吗相减为1,那么在上一个长度的基础上+1;否则直接赋值1。

(2)求数字序列的最长连续上升序列的和(比如34123480,1234和为10)

    思路:构造一同样大小的数组来记录到目前为止的最长连续序列的和。在确定该位置的和是,和前一个比较,如果相差1,那么在上一个和的基础上+该位置原数组的值;否则直接复制该位置原数组的值。

(3)数列中最大连续元素之和(比如:3 -2 5 1 -10,最大元素之和为7(3 -2 5 1))

int MaxSubSum(int *arr,int n)
{
    int tmp = 0;
    int MAX = arr[0];
    for(int i = 0 ; i < n ; i++)
    {
        tmp += arr[i];
        if(tmp < 0)
        {
            tmp = 0;
        }
        if(MAX < tmp)
        {
            MAX = tmp;
        }
    }
    return MAX;
View Code

相关文章:

  • 2022-12-23
  • 2022-01-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-07
猜你喜欢
  • 2021-06-20
  • 2021-11-24
  • 2021-05-27
  • 2021-05-25
  • 2021-10-22
相关资源
相似解决方案