设为首页 加入收藏

TOP

POJ 2264 Advanced Fruits(最长公共子序列)
2015-07-20 17:24:47 来源: 作者: 【 】 浏览:2
Tags:POJ 2264 Advanced Fruits 最长 公共 序列

这题要用到最长公共子序列,又是DP,可是不会,于是就去学这个,看了一会儿,终于有点心得了。

主体思想就是先求出最长公共子序列,然后把公共字符之前的所有字符都合并起来。具体请看下面的注释。

#include
  
   
#include
   
     const int N=105; char s1[N],s2[N],s[N*2]; int lcs[N][N],index1[N],index2[N];//index和index2是用来记录公共字符所在的索引。 void get_lcs() { int len1=strlen(s1); int len2=strlen(s2); memset(lcs,0,sizeof(lcs)); for(int i=1;i<=len1;i++)//求出最长公共子序列的长度 { for(int j=1;j<=len2;j++) { if(s1[i-1]==s2[j-1]) lcs[i][j]=lcs[i-1][j-1]+1; else { if(lcs[i-1][j]>lcs[i][j-1]) lcs[i][j]=lcs[i-1][j]; else lcs[i][j]=lcs[i][j-1]; } } } int i=len1-1,j=len2-1,top=0; while(i!=-1&&j!=-1)//求出所有公共字符的索引 { if(s1[i]==s2[j]) { index1[top]=i,index2[top]=j; top++,i--,j--; } else { if(lcs[i+1][j+1]==lcs[i][j]) i--,j--; else { if(lcs[i+1][j]>lcs[i][j+1]) j--; else i--; } } } index1[top]=-1,index2[top]=-1;//设置这个是为了合并第一个公共字符之前的字符 //for(int i=0;i<=top;i++) //printf("%d,index1=%d,index2=%d\n",i,index1[i],index2[i]); int s_top=0; for(int i=top;i>=1;i--) { for(int j=index1[i]+1;j
    
     

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu4135--Co-prime(欧拉函数+容.. 下一篇POJ 1062-昂贵的聘礼(最短路_dijk..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Linux_百度百科 (2025-12-26 12:51:52)
·Shell 流程控制 | 菜 (2025-12-26 12:51:49)
·TCP/UDP协议_百度百科 (2025-12-26 12:20:11)
·什么是TCP和UDP协议 (2025-12-26 12:20:09)
·TCP和UDP详解 (非常 (2025-12-26 12:20:06)