UVA 1045 最长公共子序列

题目描述:求最长公共子序列

              若给定序列X={x1,x2,...,xm},另一序列Z={z1,z2,...,zk},是X的子序列是指存在一个严格递增的下标序列{i1,i2,...,ik}使得对所以j=1,2,...,k有zj=x(ij)

              例如Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}

分析:DP的经典题

        状态表示:d[i,j]记录序列x(i)和y(j)的最长公共子序列,其中x(i)={x1,x2,...,xi},y(j)={y1,y1,...,yj},原问题最优解为d[len1,len2]

        转移方程:i=0或j=0时,d[i][j]=0;

                      xi=yj时,d[i][j]=d[i-1][j-1]+1;

                      xi != yj 时,d[i][j]=max( d[i-1][j],d[i][j-1] )

 1 #include<cstdio>
 2 #include<cstring>
 3 int d[1005][1005];
 4 int max(int a,int b)
 5 {
 6     return a>b ? a : b;
 7 }
 8 int main()
 9 {
10     char rank1[1005],rank2[1005];
11     int i,j;
12     while(gets (rank1+1))
13     {
14         gets(rank2+1);
15         memset(d,0,sizeof(d));
16         int len1=strlen(rank1+1);
17         int len2=strlen(rank2+1);
18         for(i=1; i<=len1; i++)
19             for(j=1; j<=len2; j++)
20             {
21                 if(rank1[i]==rank2[j])
22                     d[i][j]=d[i-1][j-1]+1;
23                 else
24                     d[i][j]=max(d[i-1][j],d[i][j-1]);
25             }
26         printf("%d\n",d[len1][len2]);
27     }
28     return 0;
29 }

 

posted @ 2014-04-04 23:16  DF的翱翔  阅读(205)  评论(0编辑  收藏  举报