打印本文 关闭窗口 |
|
| 计算机等级考试C语言程序设计例解(04) | |
| 作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:00:39 文章录入:杜斌 责任编辑:杜斌 | |
|
|
|
|
04. 试从含有n个int型数的数组中删去若干个成分,使剩下的全部成分构成一个不减的子序列。设计算法和编写程序求出数组的不减子序列的长。
程序代码如下: #include<stdio.h> #define N 100 int b[]={9,8,5,4,3,2,7,6,8,7,5,3,4,5,9,1}; int a[N]; #define n sizeof b/sizeof b[0] void main() { int k,i,j; a[1]=b[0]; k=1; for(i=1;i<n;i++) { for(j=k;j>=1&&a[j]>b[i];j--); a[j+1]=b[i]; /*长为j+1的子序列的终元素存贮在a[j+1]*/ if(j==k) k++; /*最长不减子序列长k增1*/ } printf("K = %d\n",k); } 程序运行结果如下: k = 5 ------------------ 若把本问题改为求从数组中删去部分元素后的最长不减子序列,就要在求最长不减子序列长的过程中,不仅要保留各种长度不减子序列的终元素,同时要保留不减子序列的全部元素。为此,上述程序中的数组a[]应改为两维数组a[][],其中a[][]的j行存储长为不减子序列的元素,该子序列的终元素为a[j][j-1]。在找到一个终元素更小的长为j+1的不减子序列时,除用b[i]作为j+1的子序旬的终止元素外,应同时将长为j的子序列元素全部复制到长为j+1的子序列中。直接写出程序如下: #include<stdio.h> #define N 100 int b[] = {9,8,5,4,3,2,7,6,8,7,5,3,4,5,9,1}; int a[N][N]; #define n sizeof b/sizeof b[0] void main() { int k,i,j,m; a[1][0]=b[0]; k=1; for(i=1;i<n;i++) { for(j=k;j>=1&&a[j][j-1]>b[i];j--); for(m=0;m<j;m++) /*长为j的子序列复制到长为j+1的子序列* a[j+1][m]=a[j][m]; |
|
打印本文 关闭窗口 |