动态规划算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业:网络工程
班级:
学号:
姓名:
日期:年月日
2、题目二
(1)问题分析
若给定序列X={x1, x2,…, x m},则另一序列Z={z1, z2,…, z k}是X的子序列是指存在一个严格递增的下标序列{i1, i2,…, i k},使得对于所有j=1,2,…,k有Xi j=Zj,即求它们的公共子序列。
(2)算法描述
设序列X={x1, x2, …, x m}和Y={y1, y2, …, y n}的一个最长公共子序列Z={z1, z2, …, z k},则:
1.若x m=y n,则z k=x m=y n且Z k-1是X m-1和Y n-1的最长公共子序列;
2.若x m≠y n且z k≠x m,则Z是X m-1和Y的最长公共子序列;
3.若x m≠y n且z k≠y n,则Z是X和Y n-1的最长公共子序列。
其中X m-1={x1, x2, …, x m-1},Y n-1={y1, y2, …, y n-1},Z k-1={z1, z2, …, z k-1}。
用c[i,j]记录序列X i和Y j的最长公共子序列的长度。其中X i={x1, x2, …, x i},Y j={y1, y2,…, y j}。当i=0或j=0时,空序列是X i和Y j的最长公共子序列,故c[i,j]=0。由最优子结构性质可建立递归关系如下:
⎪
⎩
⎪
⎨
⎧
≠
>
-
-
=
>
+
-
-
=
=
=
时
且
当
时
且
当
时
或就
当
j
i
j
i
y
x
j
i
j
i c
j
i c
y
x
j
i
j
i c
j
i c
,
]}
,1
[
],1
,[
{
max
,
1
]1
,1
[
i
]
,[
(3)运行结果
3、题目三
(1)问题分析
在一块电路板的上、下2端分别有n个接线柱。根据电路设计,要求用导线(i,π(i))将上端接线柱与下端接线柱相连,如图所示。其中π(i)是{1,2,…,n}的一个排列。导线(i,π(i))称为该电路板上的第i条连线。对于任何1≤i
确定将哪些连线安排在第一层上,使得该层上又尽可能多的连线。也就是说,该问题要求确定导线集Nets={(i,π(i)),1≤i≤n}的最大不相交子集。
(2)算法描述
最优值size(n,n)的递归结构为:
(1)当i=1时,
⎩
⎨
⎧
≥
<
=
)1(
1
)1(
)
,1(
π
π
j
j
j
Size
(2)当i>1时,
⎩
⎨
⎧
≥
+
-
-
-
<
-
=
)(
}1
)1
)(
,1
(
),
,1
(
{
)(
)
,1
(
)
,(
i
j
i
i
Size
j
i
Size
Max
i
j
j
i
Size
j
i
Size
π
π
π
(3)运行结果
五、出现的问题及解决的方法
六、源代码
题目一
public static void main(String[] args) {
Matrix M=new Matrix(4);
M.printAllM();
M.matrixChain(M.p,M.m,M.s);
System.out.print("矩阵链所需的最少乘次数为:"+M.m[1][M.MN]);
System.out.println();
String []s=new String[M.MN+1];
System.out.println("最优计算次序:");
for(int i=1;i<=M.MN;i++){
s[i]="A"+i;
}
M.traceback(M.s, 1, M.MN,s);
for(int i=1;i<=M.MN;i++){
System.out.print(s[i]);
}
}
public class Matrix {
int MN; //表示矩阵链中矩阵的数目
int[] p; //存放各个矩阵的维数
int [][][]A; //存放要进行连乘的多个矩阵
int [][]m; //用来存放Ai到Aj的最少乘次数
int [][]s; //用来存放Ai到Aj的最后断开位置
public Matrix(){
MN=0;
p=new int [MN];
} //构造函数,L为矩阵的数目
public Matrix(int L){
MN=L;
p=new int [MN+1];
A=new int [MN][][];
m=new int [MN+1][MN+1];
s=new int [MN+1][MN+1];
for(int i=0;i<=MN;i++){//随机生成连乘矩阵的维数[1-11]
p[i]=(int) Math.round(Math.random()*10)+1;
}
for(int i=0;i A[i]=new int [p[i]][p[i+1]]; CreatMatrix(A[i],p[i],p[i+1]); } } //创建矩阵a,维数为m*n void CreatMatrix(int [][]a,int m,int n){ for(int i=0;i for(int j=0;j a[i][j]=(int) Math.round(Math.random()*99)-50; } //输出连乘的所有矩阵 void printAllM(){ for (int i=0;i System.out.println("A"+(i+1)+": "+A[i].length +"*"+A[i][0].length ); printM(A[i]); } } //输出矩阵a的每个元素 void printM(int [][]a) { for(int i=0;i System.out.print(" ");