最长递增子序列

给定长度为n的正整数序列a1,a2,…,an。 求一个递增的子序列,和最大。

输入:
第一行,n,表示给定序列的个数。 第二行,n个用空格隔开的正整数。

输出:
递增子序列的最大和。
数据范围限制

n ≤ 1000, 0 ≤ ai ≤ 100000。

思路:

动态规划的关键点是需要正确的找到的子问题 以及正确的划分好状态值
在该问题当中 用max_sun[]数组存放 对应索引处的最大值 需要先将其每个值设置为输入数组的值 这是因为 1 3 2 4 4 在这个数组当中 索引为2的点 最大子序列的和 为 2 所以先将每一个值设置为输入数组的值

#include<stdio.h>

// 递增子序列最大和

#define M 5
int max_sum[5]= {-1};

int sloveMax(int arr[]);
int main() {

    int nums[M]= {1, 10, 3, 2, 5}; // 11 最大和是11 递增子序列1 2 3 5
    int max_sum_num = sloveMax(nums);
    printf("max num:%d\n",max_sum_num);
    for(int i = 0; i<M; i++)
        printf("max_sum[%d]:%d\n",i,max_sum[i]);
    return 0;
}

// 到底该怎么找到动态规划的值

// 数组的名字是指针常量 不能放在等号的左边用于赋值

int arrMax(int arr[]) {
    int maxNum=0;
    for(int i = 0; i < M; i++) {
        if(arr[i]>maxNum)
            maxNum=arr[i];
    }
    return maxNum;
}

int sloveMax(int arr[]) {
    int i = 0;
    int j = 0;
    max_sum[i]=arr[i];
    int flag = 1;
    for(i = 1; i < M; i++) {
        flag=1;
        for(j = 0; j < i; j++) {
            if(arr[j] > arr[i]) {
//              printf("arr[%d]:%d\n",j,arr[j]);
                flag=0;
                break;
            }
        }
        if(flag==0)
            max_sum[i] = max_sum[j-1]+arr[i];
        else {
            max_sum[i] = arrMax(max_sum)+arr[i];
        }
    }
    return  arrMax(max_sum);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容