问题描述
LSC:求两串最长相同的子串
0/1背包:V体积的背包,有N个物品 ,每个物品都有自己的体积和重量,问该背包能装的最大质量。
算法思想
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
核心算法
//lsc算法
for(i=1;i<=lena;++i){
for(j=1;j<=lenb;++j){
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
//背包算法
for(int i=0;i<n;i++){ //滚动数组优化
for(int j=m;j>=0;j--){
if(j>=w[i]){
dp[j]=max(dp[j],(dp[j-w[i]]+v[i]));
}
}
}