算法设计实验九

实验报告

课程名称 《算法分析与设计》 实验日期 2021年 5 月 10 日 至 2021 年 5 月 10 日
学生姓名 林泓佺 所在班级 计算机193 学号 20019212212088
实验名称 矩阵链乘法
实验地点 勤园13号楼208 同组人员 林泓佺

1.问题
[LCS(最长公共子序列)问题:一个序列中按下标严格递增拿取的一段元素称为这个序列的子序列,不一定连续。问两个序列最长的公共子序列。
完全背包问题:有一个背包容量为m,有n种物品每种数量无限,每个物品重量w[i],价值val[i]。问背包最多可以装多大价值物品。]
2.解析
[两个序列的LCS可以有一个递推关系
有两个序列x,y。我们令lcs[i, j]为从1到x[i]和从1到y[j]的最长公共子序列。
那么如果x[i] == y[j], lcs[i, j] = lcs[i + 1, j - 1], 否则,lcs[i, j] = max(lcs[i + 1, j], lcs[i, j - 1])
递推可得最优解
完全背包,每个物品可以选无限次,那么贪心的想就是对于这个物品能拿多少就拿多少直到装满。
对于第一个物品装满背包后,再看第二个物品,那么就是比较拿出背包中一些物品放入第二个物品是否会更优。那么可以有递推的关系,即当前容量v,b[v] = max(b[v], b[v - c[i]] + w[i])
]
LCS:
输入:
azcbdea
Aczbade
推导:
两字符串在1,1处相等,dp[1][1]=dp[0][0]+1=1
在1,2处,dp[0][2]<dp[1][1],dp[1][2]=dp[1][1]+1=1
在1,3处,dp[0][3]<dp[1][2],dp[1][3]=dp[1][2]+1=1
在1,4处,dp[0][4]<dp[1][3],dp[1][4]=dp[1][3]+1=1
两字符串在1,5处相等,dp[1][5]=dp[0][4]+1=1
在1,6处,dp[0][6]<dp[1][5],dp[1][6]=dp[1][5]+1=1
在1,7处,dp[0][7]<dp[1][6],dp[1][7]=dp[1][6]+1=1
在2,1处,dp[1][1]>dp[2][0],dp[2][1]=dp[1][1]+1=1
在2,2处,dp[1][2]<dp[2][1],dp[2][2]=dp[2][1]+1=1
两字符串在2,3处相等,dp[2][3]=dp[1][2]+1=2
在2,4处,dp[1][4]<dp[2][3],dp[2][4]=dp[2][3]+1=2
在2,5处,dp[1][5]<dp[2][4],dp[2][5]=dp[2][4]+1=2
在2,6处,dp[1][6]<dp[2][5],dp[2][6]=dp[2][5]+1=2
在2,7处,dp[1][7]<dp[2][6],dp[2][7]=dp[2][6]+1=2
在3,1处,dp[2][1]>dp[3][0],dp[3][1]=dp[2][1]+1=1
两字符串在3,2处相等,dp[3][2]=dp[2][1]+1=2
在3,3处,dp[2][3]<dp[3][2],dp[3][3]=dp[3][2]+1=2
在3,4处,dp[2][4]<dp[3][3],dp[3][4]=dp[3][3]+1=2
在3,5处,dp[2][5]<dp[3][4],dp[3][5]=dp[3][4]+1=2
在3,6处,dp[2][6]<dp[3][5],dp[3][6]=dp[3][5]+1=2
在3,7处,dp[2][7]<dp[3][6],dp[3][7]=dp[3][6]+1=2
在4,1处,dp[3][1]>dp[4][0],dp[4][1]=dp[3][1]+1=1
在4,2处,dp[3][2]>dp[4][1],dp[4][2]=dp[3][2]+1=2
在4,3处,dp[3][3]<dp[4][2],dp[4][3]=dp[4][2]+1=2
两字符串在4,4处相等,dp[4][4]=dp[3][3]+1=3
在4,5处,dp[3][5]<dp[4][4],dp[4][5]=dp[4][4]+1=3
在4,6处,dp[3][6]<dp[4][5],dp[4][6]=dp[4][5]+1=3
在4,7处,dp[3][7]<dp[4][6],dp[4][7]=dp[4][6]+1=3
在5,1处,dp[4][1]>dp[5][0],dp[5][1]=dp[4][1]+1=1
在5,2处,dp[4][2]>dp[5][1],dp[5][2]=dp[4][2]+1=2
在5,3处,dp[4][3]<dp[5][2],dp[5][3]=dp[5][2]+1=2
在5,4处,dp[4][4]>dp[5][3],dp[5][4]=dp[4][4]+1=3
在5,5处,dp[4][5]<dp[5][4],dp[5][5]=dp[5][4]+1=3
两字符串在5,6处相等,dp[5][6]=dp[4][5]+1=4
在5,7处,dp[4][7]<dp[5][6],dp[5][7]=dp[5][6]+1=4
在6,1处,dp[5][1]>dp[6][0],dp[6][1]=dp[5][1]+1=1
在6,2处,dp[5][2]>dp[6][1],dp[6][2]=dp[5][2]+1=2
在6,3处,dp[5][3]<dp[6][2],dp[6][3]=dp[6][2]+1=2
在6,4处,dp[5][4]>dp[6][3],dp[6][4]=dp[5][4]+1=3
在6,5处,dp[5][5]<dp[6][4],dp[6][5]=dp[6][4]+1=3
在6,6处,dp[5][6]>dp[6][5],dp[6][6]=dp[5][6]+1=4
两字符串在6,7处相等,dp[6][7]=dp[5][6]+1=5
两字符串在7,1处相等,dp[7][1]=dp[6][0]+1=1
在7,2处,dp[6][2]>dp[7][1],dp[7][2]=dp[6][2]+1=2
在7,3处,dp[6][3]<dp[7][2],dp[7][3]=dp[7][2]+1=2
在7,4处,dp[6][4]>dp[7][3],dp[7][4]=dp[6][4]+1=3
两字符串在7,5处相等,dp[7][5]=dp[6][4]+1=4
在7,6处,dp[6][6]<dp[7][5],dp[7][6]=dp[7][5]+1=4
在7,7处,dp[6][7]>dp[7][6],dp[7][7]=dp[6][7]+1=5
最长公共子序列长度为:
5
最长公共子序列为:
acbde

完全背包:
输入:
8 20
14 9
9 6
12 8
5 9
11 6
2 1
14 8
6 4
推导:
利用1个物品更新 更新前:dp[9]=0 更新后:14
利用1个物品更新 更新前:dp[10]=0 更新后:14
利用1个物品更新 更新前:dp[11]=0 更新后:14
利用1个物品更新 更新前:dp[12]=0 更新后:14
利用1个物品更新 更新前:dp[13]=0 更新后:14
利用1个物品更新 更新前:dp[14]=0 更新后:14
利用1个物品更新 更新前:dp[15]=0 更新后:14
利用1个物品更新 更新前:dp[16]=0 更新后:14
利用1个物品更新 更新前:dp[17]=0 更新后:14
利用1个物品更新 更新前:dp[18]=0 更新后:28
利用1个物品更新 更新前:dp[19]=0 更新后:28
利用1个物品更新 更新前:dp[20]=0 更新后:28
利用2个物品更新 更新前:dp[6]=0 更新后:9
利用2个物品更新 更新前:dp[7]=0 更新后:9
利用2个物品更新 更新前:dp[8]=0 更新后:9
利用2个物品更新 更新前:dp[9]=14 更新后:14
利用2个物品更新 更新前:dp[10]=14 更新后:14
利用2个物品更新 更新前:dp[11]=14 更新后:14
利用2个物品更新 更新前:dp[12]=14 更新后:18
利用2个物品更新 更新前:dp[13]=14 更新后:18
利用2个物品更新 更新前:dp[14]=14 更新后:18
利用2个物品更新 更新前:dp[15]=14 更新后:23
利用2个物品更新 更新前:dp[16]=14 更新后:23
利用2个物品更新 更新前:dp[17]=14 更新后:23
利用2个物品更新 更新前:dp[18]=28 更新后:28
利用2个物品更新 更新前:dp[19]=28 更新后:28
利用2个物品更新 更新前:dp[20]=28 更新后:28
利用3个物品更新 更新前:dp[8]=9 更新后:12
利用3个物品更新 更新前:dp[9]=14 更新后:14
利用3个物品更新 更新前:dp[10]=14 更新后:14
利用3个物品更新 更新前:dp[11]=14 更新后:14
利用3个物品更新 更新前:dp[12]=18 更新后:18
利用3个物品更新 更新前:dp[13]=18 更新后:18
利用3个物品更新 更新前:dp[14]=18 更新后:21
利用3个物品更新 更新前:dp[15]=23 更新后:23
利用3个物品更新 更新前:dp[16]=23 更新后:24
利用3个物品更新 更新前:dp[17]=23 更新后:26
利用3个物品更新 更新前:dp[18]=28 更新后:28
利用3个物品更新 更新前:dp[19]=28 更新后:28
利用3个物品更新 更新前:dp[20]=28 更新后:30
利用4个物品更新 更新前:dp[9]=14 更新后:14
利用4个物品更新 更新前:dp[10]=14 更新后:14
利用4个物品更新 更新前:dp[11]=14 更新后:14
利用4个物品更新 更新前:dp[12]=18 更新后:18
利用4个物品更新 更新前:dp[13]=18 更新后:18
利用4个物品更新 更新前:dp[14]=21 更新后:21
利用4个物品更新 更新前:dp[15]=23 更新后:23
利用4个物品更新 更新前:dp[16]=24 更新后:24
利用4个物品更新 更新前:dp[17]=26 更新后:26
利用4个物品更新 更新前:dp[18]=28 更新后:28
利用4个物品更新 更新前:dp[19]=28 更新后:28
利用4个物品更新 更新前:dp[20]=30 更新后:30
利用5个物品更新 更新前:dp[6]=9 更新后:11
利用5个物品更新 更新前:dp[7]=9 更新后:11
利用5个物品更新 更新前:dp[8]=12 更新后:12
利用5个物品更新 更新前:dp[9]=14 更新后:14
利用5个物品更新 更新前:dp[10]=14 更新后:14
利用5个物品更新 更新前:dp[11]=14 更新后:14
利用5个物品更新 更新前:dp[12]=18 更新后:22
利用5个物品更新 更新前:dp[13]=18 更新后:22
利用5个物品更新 更新前:dp[14]=21 更新后:23
利用5个物品更新 更新前:dp[15]=23 更新后:25
利用5个物品更新 更新前:dp[16]=24 更新后:25
利用5个物品更新 更新前:dp[17]=26 更新后:26
利用5个物品更新 更新前:dp[18]=28 更新后:33
利用5个物品更新 更新前:dp[19]=28 更新后:33
利用5个物品更新 更新前:dp[20]=30 更新后:34
利用6个物品更新 更新前:dp[1]=0 更新后:2
利用6个物品更新 更新前:dp[2]=0 更新后:4
利用6个物品更新 更新前:dp[3]=0 更新后:6
利用6个物品更新 更新前:dp[4]=0 更新后:8
利用6个物品更新 更新前:dp[5]=0 更新后:10
利用6个物品更新 更新前:dp[6]=11 更新后:12
利用6个物品更新 更新前:dp[7]=11 更新后:14
利用6个物品更新 更新前:dp[8]=12 更新后:16
利用6个物品更新 更新前:dp[9]=14 更新后:18
利用6个物品更新 更新前:dp[10]=14 更新后:20
利用6个物品更新 更新前:dp[11]=14 更新后:22
利用6个物品更新 更新前:dp[12]=22 更新后:24
利用6个物品更新 更新前:dp[13]=22 更新后:26
利用6个物品更新 更新前:dp[14]=23 更新后:28
利用6个物品更新 更新前:dp[15]=25 更新后:30
利用6个物品更新 更新前:dp[16]=25 更新后:32
利用6个物品更新 更新前:dp[17]=26 更新后:34
利用6个物品更新 更新前:dp[18]=33 更新后:36
利用6个物品更新 更新前:dp[19]=33 更新后:38
利用6个物品更新 更新前:dp[20]=34 更新后:40
利用7个物品更新 更新前:dp[8]=16 更新后:16
利用7个物品更新 更新前:dp[9]=18 更新后:18
利用7个物品更新 更新前:dp[10]=20 更新后:20
利用7个物品更新 更新前:dp[11]=22 更新后:22
利用7个物品更新 更新前:dp[12]=24 更新后:24
利用7个物品更新 更新前:dp[13]=26 更新后:26
利用7个物品更新 更新前:dp[14]=28 更新后:28
利用7个物品更新 更新前:dp[15]=30 更新后:30
利用7个物品更新 更新前:dp[16]=32 更新后:32
利用7个物品更新 更新前:dp[17]=34 更新后:34
利用7个物品更新 更新前:dp[18]=36 更新后:36
利用7个物品更新 更新前:dp[19]=38 更新后:38
利用7个物品更新 更新前:dp[20]=40 更新后:40
利用8个物品更新 更新前:dp[4]=8 更新后:8
利用8个物品更新 更新前:dp[5]=10 更新后:10
利用8个物品更新 更新前:dp[6]=12 更新后:12
利用8个物品更新 更新前:dp[7]=14 更新后:14
利用8个物品更新 更新前:dp[8]=16 更新后:16
利用8个物品更新 更新前:dp[9]=18 更新后:18
利用8个物品更新 更新前:dp[10]=20 更新后:20
利用8个物品更新 更新前:dp[11]=22 更新后:22
利用8个物品更新 更新前:dp[12]=24 更新后:24
利用8个物品更新 更新前:dp[13]=26 更新后:26
利用8个物品更新 更新前:dp[14]=28 更新后:28
利用8个物品更新 更新前:dp[15]=30 更新后:30
利用8个物品更新 更新前:dp[16]=32 更新后:32
利用8个物品更新 更新前:dp[17]=34 更新后:34
利用8个物品更新 更新前:dp[18]=36 更新后:36
利用8个物品更新 更新前:dp[19]=38 更新后:38
利用8个物品更新 更新前:dp[20]=40 更新后:40

最大收益为 : 40
3.设计
[
Lcs:
#include<bits/stdc++.h>
using namespace std;
char a[1010];
char b[1010];
int len1;
int len2;
int dp[1010][1010];
int vis[1010][1010];
void lcs()
{ int i,j;
for(i=1; i<=len1; i++)
{
for(j=1; j<=len2; j++)
{
if(a[i-1] == b[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
printf(“两字符串在%d,%d处相等,dp[%d][%d]=dp[%d][%d]+1=%d\n”,i,j,i,j,i-1,j-1,dp[i][j]);
vis[i][j]=0;}
else if(dp[i-1][j] > dp[i][j-1]){
dp[i][j] = dp[i-1][j];
printf(“在%d,%d处,dp[%d][%d]>dp[%d][%d],dp[%d][%d]=dp[%d][%d]+1=%d\n”,i,j,i-1,j,i,j-1,i,j,i-1,j,dp[i][j]);
vis[i][j]=1;}
else{
dp[i][j] = dp[i][j-1];
printf(“在%d,%d处,dp[%d][%d]<dp[%d][%d],dp[%d][%d]=dp[%d][%d]+1=%d\n”,i,j,i-1,j,i,j-1,i,j,i,j-1,dp[i][j]);
vis[i][j]=-1;}
}
}
}
void print(int x,int y){
if(x0&&y0)return;
if(vis[x][y]==0){
print(x-1,y-1);
cout<<a[x-1];
}
else if(vis[x][y]==1){
print(x-1,y);
}
else{
print(x,y-1);
}
}
int main(){
scanf("%s %s",a,b);
len1=strlen(a);
len2=strlen(b);
lcs();
cout<<“最长公共子序列长度为:\n”;
cout<<dp[len1][len2]<<endl;
cout<<“最长公共子序列为:\n” ;
print(len1,len2);
cout<<endl;
}

完全背包:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int w[maxn];
int c[maxn];
int dp[maxn];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>w[i]>>c[i];
}
for(int i=0;i<n;i++){
for(int j=c[i];j<=m;j++){
cout<<“利用”<<i+1<<“个物品更新 “;
cout<<” 更新前:”<<“dp”<<"["<<j<<"]="<<dp[j]<<" “;
dp[j]=max(dp[j],dp[j-c[i]]+w[i]);
cout<<“更新后:”<<dp[j]<<endl;
}
}
cout<<”\n最大收益为 : ";
cout<<dp[m]<<endl;
}
/*
8 20
14 9
9 6
12 8
5 9
11 6
2 1
14 8
6 4
/
]
4.分析
[
LCS:事件复杂度O(n
m),空间复杂度O(n*m)
完全背包:时间复杂度O(n * m),空间复杂度O(n * m)
]
5.源码
[github源码地址:https://github.com/lhqbalabala/sf5.10]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值