《算法分析》作业9

1. 问题

LSC:求两串最长相同的子串

0/1背包:V体积的背包,有N个物品 ,每个物品都有自己的体积和重量,问该背包能装的最大质量。

 

2. 解析

LCS:

X :ABCBDAB

Y :BDCABA

//求表和长度

(1):i=1

    j=1 X.A!=Y.B :dp[1][1]=max(dp[1][0],dp[0][1])=max(0,0)=0 删除Y

    j=2 X.A!=Y.D :dp[1][2]=max(dp[1][1],dp[0][2])=max(0,0)=0 删除Y

    j=3 X.A!=Y.C :dp[1][3]=max(dp[1][2],dp[0][3])=max(0,0)=0 删除Y

    j=4 X.A==B.A :dp[1][4]=dp[0][3]+1=1 删除X,Y

    j=5 X.A!=B.B :dp[1][5]=max(dp[1][4],dp[0][5])=max(1,0)=1 删除X

    j=6 X.A==B.A :dp[1][6]=dp[0][5]+1=1 删除X,Y

(2):i=2

    j=1 X.B==Y.B :dp[2][1]=dp[1][0]+1=1 删除X,Y

    j=2 X.B!=Y.D :dp[2][2]=max(dp[2][1],dp[1][2])=max(1,0)=1 删除Y

    j=3 X.B!=Y.C :dp[2][3]=max(dp[2][2],dp[1][3])=max(1,0)=1 删除Y

    j=4 X.B!=B.A :dp[2][4]=max(dp[2][3],dp[1][4])=max(1,1)=1 删除Y

    j=5 X.B==B.B :dp[2][5]=dp[1][4]+1=2 删除X,Y

    j=6 X.B!=B.A :dp[2][6]=max(dp[2][5],dp[1][6])=max(2,1)=2 删除Y

(3):i=3

    j=1 X.C!=Y.B :dp[3][1]=max(dp[3][0],dp[2][1])=max(0,1)=1 删除X

    j=2 X.C!=Y.D :dp[3][2]=max(dp[3][1],dp[2][2])=max(1,1)=1 删除Y

    j=3 X.C==Y.C :dp[3][3]=dp[2][2]+1=2 删除X,Y

    j=4 X.C!=B.A :dp[3][4]=max(dp[3][3],dp[2][4])=max(2,1)=2 删除Y

    j=5 X.C!=B.B :dp[3][5]=max(dp[3][4],dp[2][5])=max(2,2)=2 删除Y

    j=6 X.C!=B.A :dp[3][6]=max(dp[3][5],dp[2][6])=max(2,2)=2 删除Y

(4):i=4

    j=1 X.B==Y.B :dp[4][1]=dp[3][0]+1=1 删除X,Y

    j=2 X.B!=Y.D :dp[4][2]=max(dp[4][1],dp[3][2])=max(1,2)=2 删除X

    j=3 X.B!=Y.C :dp[4][3]=max(dp[4][2],dp[3][3])=max(1,2)=2 删除X

    j=4 X.B!=B.A :dp[4][4]=max(dp[4][3],dp[3][4])=max(2,2)=2 删除Y

    j=5 X.B==B.B :dp[4][5]=dp[3][4]+1=3 删除X,Y

    j=6 X.B!=B.A :dp[4][6]=max(dp[4][5],dp[3][6])=max(3,2)=3 删除Y

(5):i=5

    j=1 X.D!=Y.B :dp[5][1]=max(dp[5][0],dp[4][1])=max(0,1)=1 删除X

    j=2 X.D==Y.D :dp[5][2]=dp[4][1]+1=2 删除X,Y

    j=3 X.D!=Y.C :dp[5][3]=max(dp[5][2],dp[4][3])=max(2,2)=2 删除Y

    j=4 X.D!=B.A :dp[5][4]=max(dp[5][3],dp[4][4])=max(2,2)=2 删除Y

    j=5 X.D!=B.B :dp[5][5]=max(dp[5][4],dp[4][5])=max(2,3)=3 删除X

    j=6 X.D!=B.A :dp[5][6]=max(dp[5][5],dp[4][6])=max(3,3)=3 删除Y

(6):i=6

    j=1 X.A!=Y.B :dp[6][1]=max(dp[5][0],dp[5][1])=max(0,1)=1 删除X

    j=2 X.A!=Y.D :dp[6][2]=max(dp[6][1],dp[5][2])=max(1,2)=2 删除X

    j=3 X.A!=Y.C :dp[6][3]=max(dp[6][2],dp[5][3])=max(2,2)=2 删除Y

    j=4 X.A==B.A :dp[6][4]=dp[5][3]+1=3 删除X,Y

    j=5 X.A!=B.B :dp[6][5]=max(dp[6][4],dp[5][5])=max(3,3)=3 删除Y

    j=6 X.A==B.A :dp[6][6]=dp[5][5]+1=4 删除X,Y

(7):i=7

    j=1 X.B==Y.B :dp[7][1]=dp[6][0]+1=1 删除X,Y

    j=2 X.B!=Y.D :dp[7][2]=max(dp[7][1],dp[6][2])=max(1,2)=2 删除X

    j=3 X.B!=Y.C :dp[7][3]=max(dp[7][2],dp[6][3])=max(2,2)=2 删除Y

    j=4 X.B!=B.A :dp[7][4]=max(dp[7][3],dp[6][4])=max(2,3)=3 删除X

    j=5 X.B==B.B :dp[7][5]=dp[6][4]+1=4 删除X,Y

    j=6 X.B!=B.A :dp[7][6]=max(dp[7][5],dp[6][6])=max(4,4)=4 删除Y

//

j/i 0 1 2 3 4 5 6 7      //X:删除 X ;Y:删除 Y ;A:删除X,Y

0   0 0 0 0 0 0 0 0

1   0 Y A X A X X A

2   0 Y Y Y X A X X

3   0 Y Y A X Y Y Y

4   0 A Y Y Y Y A X

5   0 Y A Y A X Y A

6   0 A Y Y Y Y A Y

// 输出子串

(1)

    (7,6) 查表删除 Y

    X:ABCBDAB

    Y:BDCAB

    (7,5) 查表删除 X,Y;

    X:ABCBDA

    Y:BDCA

    (6,4) 查表删除X,Y

    X:ABCBD

    Y:BDC

    (5,3) 查表删除Y

    X:ABCBD

    Y:BD

    (5,2) 查表删除X,Y

    X:ABCB

    Y:B

    (4,1) 查表删除X,Y

    X:ABC

    Y:

    (3,0) 算法结束 输出 BDAB

 

0/1背包:

0/1背包:

n=5 V=10

w1=1 w2=2 w3=3 w4=4 w5=5

v1=5 v2=4 v3=3 v4=2 v1=1

 

(1) i=1

    j=10 : dp[10]=max(dp[10],dp[10-5]+w[1])=max(0,1)=1;

    j=9  : dp[9]=max(dp[9],dp[9-5]+w[1])=max(0,1)=1;

    j=8  : dp[8]=max(dp[8],dp[8-5]+w[1])=max(0,1)=1;

    j=7  : dp[7]=max(dp[7],dp[7-5]+w[1])=max(0,1)=1;

    j=6  : dp[6]=max(dp[6],dp[6-5]+w[1])=max(0,1)=1;

    j=5  : dp[5]=max(dp[5],dp[5-5]+w[1])=max(0,1)=1;

(2) i=2

    j=10 : dp[10]=max(dp[10],dp[10-4]+w[2])=max(1,3)=3;

    j=9  : dp[9]=max(dp[9],dp[9-4]+w[2])=max(1,3)=3;

    j=8  : dp[8]=max(dp[8],dp[8-4]+w[2])=max(1,2)=2;

    j=7  : dp[7]=max(dp[7],dp[7-4]+w[2])=max(1,2)=2;

    j=6  : dp[6]=max(dp[6],dp[6-4]+w[2])=max(1,2)=2;

    j=5  : dp[5]=max(dp[5],dp[5-4]+w[2])=max(1,2)=2;

    j=4  : dp[4]=max(dp[4],dp[4-4]+w[2])=max(0,2)=2;

(3) i=3

    j=10 : dp[10]=max(dp[10],dp[10-3]+w[3])=max(2,5)=5;

    j=9  : dp[9]=max(dp[9],dp[9-3]+w[3])=max(3,5)=5;

    j=8  : dp[8]=max(dp[8],dp[8-3]+w[3])=max(2,5)=5;

    j=7  : dp[7]=max(dp[7],dp[7-3]+w[3])=max(2,5)=5;

    j=6  : dp[6]=max(dp[6],dp[6-3]+w[3])=max(2,3)=3;

    j=5  : dp[5]=max(dp[5],dp[5-3]+w[3])=max(2,3)=3;

    j=4  : dp[4]=max(dp[4],dp[4-3]+w[3])=max(0,3)=3;

    j=3  : dp[3]=max(dp[3],dp[3-3]+w[3])=max(0,3)=3;

(4) i=4

    j=10 : dp[10]=max(dp[10],dp[10-2]+w[4])=max(5,9)=9;

    j=9  : dp[9]=max(dp[9],dp[9-2]+w[4])=max(5,9)=9;

    j=8  : dp[8]=max(dp[8],dp[8-2]+w[4])=max(5,7)=7;

    j=7  : dp[7]=max(dp[7],dp[7-2]+w[4])=max(5,7)=7;

    j=6  : dp[6]=max(dp[6],dp[6-2]+w[4])=max(3,7)=7;

    j=5  : dp[5]=max(dp[5],dp[5-2]+w[4])=max(3,7)=7;

    j=4  : dp[4]=max(dp[4],dp[4-2]+w[4])=max(3,4)=4;

    j=3  : dp[3]=max(dp[3],dp[3-2]+w[4])=max(3,4)=4;

    j=2  : dp[2]=max(dp[2],dp[2-2]+w[4])=max(0,4)=4;

(5) i=5

    j=10 : dp[10]=max(dp[10],dp[10-1]+w[5])=max(9,14)=14;

    j=9  : dp[9]=max(dp[9],dp[9-1]+w[5])=max(9,14)=14;

    j=8  : dp[8]=max(dp[8],dp[8-1]+w[5])=max(7,12)=12;

    j=7  : dp[7]=max(dp[7],dp[7-1]+w[5])=max(7,12)=12;

    j=6  : dp[6]=max(dp[6],dp[6-1]+w[5])=max(7,12)=12;

    j=5  : dp[5]=max(dp[5],dp[5-1]+w[5])=max(7,12)=12;

    j=4  : dp[4]=max(dp[4],dp[4-1]+w[5])=max(4,9)=9;

    j=3  : dp[3]=max(dp[3],dp[3-1]+w[5])=max(4,9)=9;

    j=2  : dp[2]=max(dp[2],dp[2-1]+w[5])=max(4,9)=9;

    j=1  : dp[1]=max(dp[1],dp[1-1]+w[5])=max(0,5)=5;

 

dp[10]=14

 

3. 设计

LCS:

 

 

 

0/1背包:

For i=1 to N

For j=V to v[i]

Dp[j]=max(dp[j-v[i]]+w[i],dp[j])

 

4. 分析

 

LSC:O(n*m)

 

0/1背包:O(n*V)

 

5. 源码

 

https://github.com/xiaojunjun601/sfHomework1/tree/master/%E4%BB%A3%E7%A0%81

 

posted @ 2021-05-10 22:49  JamZF  阅读(47)  评论(0编辑  收藏  举报