动态规划算法实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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π(j)。

确定将哪些连线安排在第一层上,使得该层上又尽可能多的连线。也就是说,该问题要求确定导线集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(" ");

for(int j=0;j

System.out.print(a[i][j]+" ");

System.out.println();

}

}

public static void matrixMultiply(int [][]a,int [][]b,int [][]c,int ra,int ca,int rb,int cb){

相关文档
最新文档