马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
描述
阿贝尔,挪威数学家,一生穷困潦倒,他希望以他的才华在皇家科学院谋职以支撑他的生活。他给当时的权威高斯寄去了他的研究成果,但是高斯不希望有人能超过他,不愿意收阿贝尔为徒弟。尽管阿贝尔成就极高,却在生前没有得到认可,他的生活非常贫困,死时只有27岁。就在他死后的第二天,皇家科学院给他寄去了任职信。
阿贝尔定理应用于数列判敛,所以正如你们所料,阿贝尔留下的是两个序列,希望你能计算出最长的公共子序列。
举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个,比如其中的cb,cgs等等都是其子序列,我们可以看出子序列不见得一定是连续的,连续的那是子串。
输入
第一行为第一个字符串,第二行为第二个字符串,两个字符串的长度均不超过100
输出
输出这两个字符串的最长的公共子序列
样例输入
cnblogs
belong
样例输出
blog
#include <stdio.h>
#include <string.h>
int k = 0;
char yuri[101][101];
char *str(char *fuck,char *shit,char *temp);
int main(void)
{
char fuck[101];
char shit[101];
while(scanf("%s\n%s", fuck,shit) != EOF)
{
char temp[101];
if(strlen(fuck) > strlen(shit))
{
printf("%s\n", str(fuck,shit,temp));
}
else
{
printf("%s\n", str(shit,fuck,temp));
}
for(int i = 0; i < 101; i++)
{
for(int j = 0; j < 101; j++)
{
yuri[i][j] = '\0';
}
}
}
return 0;
}
char *str(char *fuck,char *shit, char *temp)
{
int w = 0;
int k = 0;
int fault = 0;
for(int u = 0; u < strlen(shit); u++)
{
for(int i = u; i < strlen(shit); i++)
{
for(int j = w; j < strlen(fuck); j++)
{
if(shit[i] == fuck[j])
{
temp[k] = shit[i];
k++;
w = j + 1;
break;
}
}
}
temp[k] = '\0';
strcpy(yuri[fault],temp);
fault++;
for(int i = 0; i < k; i++)
{
temp[i] = '\0';
}
k = 0;
w = 0;
}
char ttemp[101];
for(int i = 0; i < fault - 1; i++)
{
for(int j = 0; j < fault - 2; j++)
{
if(strlen(yuri[j]) < strlen(yuri[j+1]))
{
strcpy(ttemp,yuri[j]);
strcpy(yuri[j],yuri[j+1]);
strcpy(yuri[j+1],ttemp);
}
}
}
return yuri[0];
}
一直过不了这道题 。求解。。。
这道题可以用DP做,状态转移方程是f[i][j]=max(f[i-1][j],f[i][j-1])
如果两个字符相等,加上f[i][j]=max(f[i][j],f[i-1][j-1]+1)
条件是a[i-1]==b[j-1]
思想是将这个问题分成许多子结构,并求出最优的子结构,再根据子结构的答案,算出整体答案
代码如下↓↓↓ #include <bits/stdc++.h>
using namespace std;
int main()
{
char a[105],b[105];
int n=1,m=1;
while ((a[n]=getchar())!='\n') n++;
while ((b[m]=getchar())!='\n') m++;
n--;m--;
int f[n+1][m+1];
memset(f,0,sizeof(f));
char c[105];
int k=1;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
f[i][j]=max(f[i-1][j],f[i][j-1]);
if (a[i-1]==b[j-1])
{
f[i][j]=max(f[i][j],f[i-1][j-1]+1);
if (f[i][j]==f[i-1][j-1]+1)
{
c[k]=a[i];
k++;
}
}
}
}
for (int i=1;i<k;i++)
{
printf("%c",c[i]);
}
return 0;
}
希望对楼主有帮助
(本人学生党,发帖不易,望众大佬勿喷 )
|