|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
希望对楼主有帮助
(本人学生党,发帖不易,望众大佬勿喷  )
|
|