【C语言】动态规划——最长不下降序列问题

文章介绍了如何使用C++编程语言解决最长不下降序列问题,通过动态规划方法,计算给定整数数组中满足不降序条件的最大连续子序列长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)

若存在i1<i2<i3<…<ie且有b(i1)<=b(i2)<=…<=b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。

例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中7 ,9,16,18,19,21,22,63组成的长度为8的不下降序列即为最长不下降序列。

【输入】

第一行为n;

第二行为用空格隔开的n个整数。

【输出】

第一行为输出最大个数max(形式见样例);

第二行为max个整数形成的不下降序列,答案可能不唯一,输出一种就可以了

【输入样例】

14
13 7 9 16 38 24 37 18 44 19 21 22 63 15

【输出样例】

max=8
7 9 16 18 19 21 22 63

【完整代码】

//最长不下降序列问题
/* 以a[i]为终点的最长不下降序列,即在前 i中找小于a[i]的 数中的F[i]中的最大值 + 1
状态转移方程:F[i] =  max(F[i-1]+1
*/
#include<stdio.h>
#define SIZE 100
int max(int a, int b) {
	int max = a;
	if(a<b) max = b;
	return max;
}
int main() {
	//定义变量
	int n;
	int a[SIZE];
	int F[SIZE];
	int e; //终点位置

	//输入
	scanf("%d", &n);
	for(int i=0; i<n; i++) {
		scanf("%d", &a[i]);
		F[i] = 1;
	}
	//写状态转移方程
	for(int i=1; i<n; i++) {
		for(int j=i-1; j>=0; j--) {
			if(a[i] >= a[j])
				F[i] = max(F[i], F[j]+1);
		}
	}


	//求最大的长度
	int len =0;
	for(int i=0; i<n; i++) len = max(len, F[i]);
	printf("max = %d", len);
	return 0;
}

### C语言实现动态规划求解最长公共子序列 在C语言中,通过动态规划可以高效地解决两个字符串之间的最长公共子序列(LCS)问题。此方法利用二维数组`c[i][j]`存储`(x1, x2,... xi)`和`(y1, y2,... yj)`之间最长公共子序列的长度[^1]。 对于任意给定的一对索引i和j: - 如果`X[i]==Y[j]`,那么意味着当前字符相同,则可以在前一步的基础上增加一位共同元素,即`c[i][j]=c[i−1][j−1]+1`; - 否则,取两者之前的最大值作为当前位置的结果,也就是`c[i][j]=max(c[i−1][j], c[i][j−1])`[^2]。 下面是具体的C语言代码示例用于计算并打印两个输入串的LCS: ```c #include <stdio.h> #include <string.h> #define MAX(a,b)((a>b)? a : b) void LCSLength(char *X, char *Y, int m, int n, int c[][100]){ int i, j; for(i=0; i<=m; ++i){ for(j=0; j<=n; ++j){ if (i==0 || j==0) c[i][j]=0; else if(X[i-1]==Y[j-1]) c[i][j]=c[i-1][j-1]+1; else c[i][j]=MAX(c[i-1][j], c[i][j-1]); } } } // 打印所有可能的LCS路径 void printAllLCS(int **b, char *X, int i, int j, char *result, int index); int main(){ char X[]="ABCBDAB"; char Y[]="BDCABA"; int m=strlen(X); int n=strlen(Y); int c[m+1][n+1]; LCSLength(X,Y,m,n,c); printf("The length of the longest common subsequence is %d\n", c[m][n]); // 若要输出所有的LCS组合,可以通过修改后的print_lcs函数完成 // 这里仅展示如何获取单个LCS实例 return 0; } ``` 上述程序实现了基本功能——构建动态规划表格以及返回最终得到的最小子序列长度。如果想要进一步扩展到能够枚举出所有的LCS情况,可以根据描述调整`print_lcs()`逻辑,在遇到相等情况时分别向两个方向探索,并收集结果至列表中[^3]。 值得注意的是,当处理较长字符串时,考虑到性能因素,建议优化内存分配策略或者采用其他更高效的算法变种来减少必要的重复运算。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值