最大连续上升子序列之动态规划

动态规划之C语言

问题:
输入一组数据,找出其中最大连续上升子序列长度
输出最大连续上升子序列长度打印该子序列

12 15 10 18 20 8 16 14 24 18

思路
采用动态规划的思想,利用一个以为数组s[i]记录原数组中对应位置的最大连续上升子序列的长度
比如说:

12 15 10 18 20 8 16 14 24 18
1 2 1 2 3 1 2 1 2 1

分别有的连续上升子序列:12 15 ; 10 18 20 ; 8 16 ;14 24;18
也就是将原问题转化成了求数组s[i]的最大值
这样一来就比较直观了
下面就看一下程序代码实现吧

代码实现

#include <stdio.h>
#include <stdlib.h>
#define max 10

int main()
{
    int a[max],s[max];
    int m,k,n;
    printf("输入数组长度:\n");
    scanf("%d",&n);
    printf("输入数组的值:\n");
    for(int i=0;i < n;i++){
        scanf("%d ",a[i]);
    }
    //其中a[i]表示输入的数组
    //s[i]表示储存连续上升子序列的下标
    //m 表示当前的最大连续上升子序列的长度
    //k 表示最大连续子序列的终点下标
    //n 表示数组的长度
    s[0] = 1;m = s[0];k = 0;
    for(int i=1;i < n;i++){
        if(a[i] > a[i-1]){
            s[i] = s[i] + s[i-1] + 1;
        }else{
            s[i] = 1;
        }
        if(s[i] > m){
            m = s[i];
            k=i;
        }
    }
    printf("最长连续上升子序列长度:%d\n",m);
    printf("最大连续上升子序列为:\n");
    for(int i=k-m+1;i < k;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

posted @ 2020-12-16 13:27  快要学不动了  阅读(442)  评论(0)    收藏  举报