pku2250--Compromise(最长公共子串,记录结果)
2009-01-08 23:39
579 查看
题目很简单,多一个记录。。。。
忘了一个等于号,害我弄了大概一个小时。。。
郁闷了,考虑真不全面。。
代码如下:
Code
#include<stdio.h>
#include<string.h>
char a[105][35],b[105][35];
char result[105][35];
int opt[105][105],best[105][105];
int lena,lenb;
void init()
{
int i,j;
for(i=0;i<105;i++)
best[i][0]=best[0][i]=0;
}
int input()
{
lena=lenb=0;
if(scanf("%s",a[1])==EOF)
return 0;
else{
lena=1;
while(scanf("%s",a[++lena]),strcmp(a[lena],"#"))
;
lena--;
while(scanf("%s",b[++lenb]),strcmp(b[lenb],"#"))
;
lenb--;
}
return 1;
}
void output()
{
int i,j;i=lena;j=lenb;
while(best[i][j]){
if(opt[i][j]==0){
strcpy(result[(best[i][j])],a[i]);
i--;j--;
}
else if(opt[i][j]==-1)
i--;
else if(opt[i][j]==1)
j--;
}
for(i=1;i<best[lena][lenb];i++)
printf("%s ",result[i]);
printf("%s\n",result[(best[lena][lenb])]);
}
void process()
{
int i,j;
for(i=1;i<=lena;i++)
for(j=1;j<=lenb;j++){
if(strcmp(a[i],b[j])==0){
best[i][j]=best[i-1][j-1]+1;
opt[i][j]=0;
}
else if(best[i-1][j]>=best[i][j-1]){
best[i][j]=best[i-1][j];
opt[i][j]=-1;
}
else if(best[i][j-1]>best[i-1][j]){
best[i][j]=best[i][j-1];
opt[i][j]=1;
}
}
}
int main()
{
init();
while(input()){
process();
output();
}
return 1;
}
忘了一个等于号,害我弄了大概一个小时。。。
郁闷了,考虑真不全面。。
代码如下:
Code
#include<stdio.h>
#include<string.h>
char a[105][35],b[105][35];
char result[105][35];
int opt[105][105],best[105][105];
int lena,lenb;
void init()
{
int i,j;
for(i=0;i<105;i++)
best[i][0]=best[0][i]=0;
}
int input()
{
lena=lenb=0;
if(scanf("%s",a[1])==EOF)
return 0;
else{
lena=1;
while(scanf("%s",a[++lena]),strcmp(a[lena],"#"))
;
lena--;
while(scanf("%s",b[++lenb]),strcmp(b[lenb],"#"))
;
lenb--;
}
return 1;
}
void output()
{
int i,j;i=lena;j=lenb;
while(best[i][j]){
if(opt[i][j]==0){
strcpy(result[(best[i][j])],a[i]);
i--;j--;
}
else if(opt[i][j]==-1)
i--;
else if(opt[i][j]==1)
j--;
}
for(i=1;i<best[lena][lenb];i++)
printf("%s ",result[i]);
printf("%s\n",result[(best[lena][lenb])]);
}
void process()
{
int i,j;
for(i=1;i<=lena;i++)
for(j=1;j<=lenb;j++){
if(strcmp(a[i],b[j])==0){
best[i][j]=best[i-1][j-1]+1;
opt[i][j]=0;
}
else if(best[i-1][j]>=best[i][j-1]){
best[i][j]=best[i-1][j];
opt[i][j]=-1;
}
else if(best[i][j-1]>best[i-1][j]){
best[i][j]=best[i][j-1];
opt[i][j]=1;
}
}
}
int main()
{
init();
while(input()){
process();
output();
}
return 1;
}
相关文章推荐
- 【UVA】531-Compromise(最长公共子串)
- PKU 2774(后缀数组求最长公共子串)
- Compromise(最长公共子串变形,打印路径)
- 动态规划 最长公共子串问题 记录一下
- PKU2774(Long Long Message)求最长公共子串(后缀数组)
- PKU 2774 Long Long Message 后缀数组 最长公共子串
- pku2774 求最长公共子串
- PKU2250 最长公共字串 DP
- POJ 2250 Compromise(需要标记的最长公共子串)
- 最长公共字串 记录最长字串的结果
- HDU 2328 Corporate Identity(Trie·最长公共子串)
- 最长公共子串(java)
- POJ3080 Blue Jeans(KMP,求最长公共子串)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- poj 2774 最长公共子串 后缀数组
- 最长公共子串
- Long Long Message+POJ+后缀数组之求最长公共子串
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 求出两个字符串的最长公共子串
- 文本相似度计算之--- 编辑距离 && 最长公共子串