先来看问题,
最长递增子列。
即数组中按顺序拿出n个数,(按照原来的顺序)该子数列为递增数列。
例如:1 2 3 -1数列最后结果为3.最对应数列很显然为1 2 3
(注,只输出长度。)
当然如果还需要对应坐标对算法进行稍加改动即可
这里主要是对思路进行理解
废话少说 下面我们开始讲解大致思路 (动态规划)
我们对数组的前n个数即第一个,第二个 第n个 分别求出以第一个,第二个, 第n好个结尾的最长连续递增子序列 那么,当我们输入第n+1个数时我们只需往前比较,找到比第n+1位小的数 ,记做第X位 ,由于我们已经得到以第X位为结尾的最长连续递增子序列的长度(记做Y) 所以 我们的以n+1位位结尾的最长连续递增子序列即为Y+1
我们依次向前对比 记录比n+1为小的 并且对应长度的最最大值 加一即可
所以我们从第一位往后知道遍历结束 就可以得出以每一位为结尾的最长连续递增子序列的长度。 故我们就可以得出结果
当然你也可以得出对应序列 这里对得出序列的步骤就不具体讲了
下面 我们看具体代码
#include <stdio.h> int Max(int a[][2],int n,int cont)//寻找 { int i; int max=0; for (i=n-1; i>=0; i--) { if (a[i][0]<cont) { if (a[i][1]>max) { max=a[i][1]; } } } return max; } int main(int argc, const char * argv[]) { // insert code here... int n; scanf("%d",&n); int n1[n][2]; int i; int max=1; for (i=0; i<n; i++) { scanf("%d",&n1[i][0]); n1[i][1]=Max(n1,i,n1[i][0])+1;//输入并寻找 赋值 if (n1[i][1]>max) { max=n1[i][1]; } } int n2[max];//存储子列 printf("%d\n",max);//输出长度 int m=max;//记录max for (i=n-1; i>=0; i--) { if (n1[i][1]==max) { n2[max-1]=n1[i][0]; max--; } } for(i=0;i<m;i++)//输出 { printf("%d ",n2[i]); } printf("\n"); return 0; }
这是测试输出结果图
这里也写了输出具体序列的代码 可以自己研究一下
如果有什么不对的地方 或者不太看的懂的地方 评论区留言
谢 !!