算法设计技术方案与分析态规划实验.docVIP

  • 2
  • 0
  • 约3.72千字
  • 约 7页
  • 2019-05-06 发布于江苏
  • 举报

算法设计技术方案与分析态规划实验.doc

算法设计技术方案与分析态规划实验

PAGE \* MERGEFORMAT2 实验5 动态规划实验 实验内容 1. 最长公共子序列问题(LCS)。在使用动态规划算法来求解最长公共子序列时,二维数组c[i][j]用于记录序列Xi和Yj的最长公共子序列的长度,对于序列X = {A, C, B, C, D, A, B, D}和Y = {A, B, D, C, A, B, A},绘制对应的c[i][j]。 所绘制的c[i][j]数组: 0 A C B C D A B D 0 0 0 0 0 0 0 0 0 0 A 0 1 1 1 1 1 2 2 2 B 0 1 1 2 2 2 2 3 3 D 0 1 1 1 1 2 2 2 3 C 0 1 2 2 3 3 3 3 3 A 0 2 2 2 2 2 3 3 3 B 0 2 2 3 3 3 3 4 4 A 0 3 3 3 3 3 4 4 4 2. 最长公共子序列问题(LCS)。使用动态规划算法求解最长公共子序列。【输入:两个字符序列;输出:两个字符序列的最长公共子序列。例如:输入序列A = ABCBDAB,序列B = BDCABA;输出BCAB(或其他任意一条长度为4的公共子序列)】 源代码: #includeiostream #includestring #includeiomanip using namespace std。 int dp[1000][1000]。 string str1,str2,s1,s2。 int max(int a,int b,int c) { if(ab ac) return a。 if(ba bc) return b。 if(ca cb) return c。 } int lcs(int len1,int len2) { memset(dp,0,sizeof(dp))。 int i,j,x。 dp[0][1]=0。 dp[1][0]=0。 dp[1][1]=0。 dp[0][0]=0。 for(i=2。ilen1+2。i++) { dp[i][1]=-2*(i-1)。 } for(j=2。jlen2+2。j++) { dp[1][j]=-2*(j-1)。 } for(j=2。jlen2+2。j++) { for(i=2。ilen1+2。i++) { if(str1[i-2]==str2[j-2]) x=dp[i-1][j-1]+5。 else x=dp[i-1][j-1]-1。 dp[i][j]=max(x,dp[i-1][j]-2,dp[i][j-1]-2)。 } } return dp[i-1][j-1]。 } void print(int len1,int len2) { int i,j。 i=len1+1。 j=len2+1。 while(i1 j1) { if(dp[i][j]+2==dp[i-1][j]) { s2=s2+_。 s1=s1+str1[i-2]。 i--。 continue。 } if(dp[i][j]+2==dp[i][j-1]) { s1=s1+_。 s2=s2+str2[j-2]。 j--。 continue。 } if(dp[i][j]+1==dp[i-1][j-1] || dp[i][j]-5==dp[i-1][j-1]) { s1=s1+str1[i-2]。 s2=s2+str2[j-2]。 j--。 i--。 continue。 } } for(i=len1-1。i=0。i--) { couts1[i]。 } coutendl。 for(j=len1-1。j=0。j--) { couts2[j]。 } coutendl。 } int main() { int len1,len2。 while(cinstr1str2) { len1=str1.size()。 len2=str2.size()。 coutlcs(len1,len2)endl。 for(int i=1。i=len1+1。i++) { for(int j=1。j=len2+1。j++) { coutsetw(5)dp[i][j] 。 } coutendl。 } print(len1,len2)。 } return 0。 } 3. 0-1背包问题。在使用动态规划算法求解0-1背包问题时,使用二维数组m[i][j]存储背包剩余容量为j,可选物品为i、i+

文档评论(0)

1亿VIP精品文档

相关文档