C语言与动态规划:随机数与最长公共子序列

需积分: 6 0 下载量 115 浏览量 更新于2024-07-19 收藏 103KB DOCX 举报
"编程复习总结2.0" 在编程学习的过程中,复习是巩固知识、提升技能的关键环节。这里我们将深入探讨两个重要的编程概念:C语言中的随机数生成以及字符串处理中的最长公共子序列(Longest Common Subsequence, LCS)问题。 首先,让我们来看看C语言如何生成随机数。在给出的代码示例中,`#include<stdio.h>` 和 `#include<stdlib.h>` 是为了引入必要的函数声明,如 `printf()` 和 `srand()`、`rand()`。`#include<time.h>` 则是为了获取当前时间,以便为随机数生成器设置种子。在 `main()` 函数中,`srand(time(0))` 使用当前时间作为种子初始化随机数生成器,确保每次运行程序时都能得到不同的随机数序列。接下来的循环中,`rand()%100+1` 用于生成1到100之间的整数,`%100` 取余操作限制了结果在0到99之间,加1是为了保证结果至少为1。 接着,我们讨论字符串处理中的动态规划问题。这里有两个相关的概念,最长公共子序列(Longest Common Subsequence, LCS)和最长公共子串(Longest Common Substring, LCS)。两者都涉及到比较两个字符串并找到它们共有的最长部分,但它们的区别在于,子序列不必连续,而子串必须是连续的。 在最长公共子序列的问题中,我们使用二维数组 `dp` 来存储两个字符串 A 和 B 的前 i 个字符与前 j 个字符的最长公共子序列的长度。通过遍历字符串,如果当前字符相同,则在前一个子序列的基础上加1,否则取之前两个子序列的较大值。最后,`dp[n][m]` 将是整个字符串的 LCS 长度。 而在最长公共子串问题中,除了计算长度外,还需要找到这个子串。同样使用二维数组 `dp`,但这里的逻辑稍有不同。如果当前字符相同,更新最大长度 `rst` 并将当前位置的 `dp` 值设为前一个子串长度加1;如果不同,`dp` 值清零,因为不构成连续子串。最终,`rst` 将是最长公共子串的长度。 通过这些复习,我们可以加深对C语言随机数生成和字符串处理中动态规划应用的理解。这不仅是理论上的复习,也是实际编程能力的锻炼,对于提升编程技巧和解决复杂问题的能力有着重要作用。