- 2
- 0
- 约3.72千字
- 约 7页
- 2019-05-06 发布于江苏
- 举报
算法设计技术方案与分析态规划实验
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)