LCS算法和背包算法

问题描述

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]));
		}
	} 
}

源码

lsc算法
背包算法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值