案例:
设有由n个不相同的整数组成的数列,记为:b(1)、b(2)、…、b(n)且b(i)<>b(j)(i<>j),若存在i1<i2<i3<…<ie且有b(i1)<b(i2)<…<b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长不下降序列。
样例输出:
请输入长度:
14
请输入序列数:
13,7,9,16,38,24,37,18,44,19,21,22,63,15
最长不下降序列的长度为:8
7,9,16,18,19,21,22,63
最开始要理解动态规划法的思路:设置一个三行n列的数组,第一行记录输入的数,
第二行添加两个常量Long=li=0,Long是记录不下降序列的长度,li记录Long之后的索引,从后往前比较,a[i][0]和a[j][0]依次比较,如果a[i][0]<a[j][0]&&a[j][1]>Long 则Long=a[j][1];li=j;
如果Long>0,则a[i][1]=Long+1;a[i][2]=li;
其求解过程如下:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
13 | 7 | 9 | 16 | 38 | 24 | 37 | 18 | 44 | 19 | 21 | 22 | 63 | 15 |
7 | 8 | 7 | 6 | 3 | 4 | 3 | 5 | 2 | 4 | 3 | 2 | 1 | 1 |
4 | 3 | 4 | 8 | 9 | 7 | 9 | 10 | 13 | 11 | 12 | 13 | 0 | 0 |
代码如下:
#include<stdio.h>
#define SIZE 101
void BuXJ(){
int a[SIZE][3],n;
printf("请输入长度\n"