动态规划之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("输入数组长度:
");
scanf("%d",&n);
printf("输入数组的值:
");
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
",m);
printf("最大连续上升子序列为:
");
for(int i=k-m+1;i < k;i++){
printf("%d ",a[i]);
}
return 0;
}