用C语言解决最长单调递增子序列。要求输入第一行一个整数 0<n<20, 表示有 n 个字符串要处理 随后的 n 行,每行有一个字符串,该字符串的长度不会超过 10000
时间: 2024-02-25 10:56:28 浏览: 73
C语言实现最长递增子序列问题的解决方法
最长单调递增子序列的问题只能应用于数值型的序列,对于字符串,我们可以将其转化成数值型的序列,例如将每个字符的ASCII码作为该字符对应的数值。然后再使用动态规划来解决。
下面给出完整的C语言代码示例,可以处理输入的 n 个字符串,每个字符串的长度不会超过 10000:
```c
#include <stdio.h>
#include <string.h>
#define MAX_N 20
#define MAX_L 10000
int main()
{
int n, len[MAX_N], nums[MAX_N][MAX_L], dp[MAX_N][MAX_L];
char str[MAX_N][MAX_L];
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%s", str[i]);
len[i] = strlen(str[i]);
for(int j=0; j<len[i]; j++)
nums[i][j] = str[i][j];
}
for(int i=0; i<n; i++)
{
for(int j=0; j<len[i]; j++)
{
dp[i][j] = 1;
for(int k=0; k<j; k++)
{
if(nums[i][k] < nums[i][j] && dp[i][k]+1 > dp[i][j])
dp[i][j] = dp[i][k] + 1;
}
}
}
int max_len = 0;
for(int i=0; i<n; i++)
{
for(int j=0; j<len[i]; j++)
{
if(dp[i][j] > max_len)
max_len = dp[i][j];
}
}
printf("%d\n", max_len);
return 0;
}
```
这个程序实际上就是对前面的代码稍作修改,将输入字符串转化成了数值型的序列,然后就可以直接套用动态规划的算法了。注意,这里输入字符串的长度可能会很长,因此我们需要将每个字符的ASCII码存储在一个整型数组中,而不是直接存储字符串。
阅读全文