动态规划算法实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验标题

1、矩阵连乘

2、最长公共子序列

3、最大子段和

4、凸多边形最优三角剖分

5、流水作业调度

6、0-1背包问题

7、最优二叉搜索树

实验目的掌握动态规划法的基本思想和算法设计的基本步骤。

实验内容与源码1、矩阵连乘

#include

#include

using namespace std;

const int size=4;

//ra,ca和rb,cb分别表示矩阵A和B的行数和列数

void matriMultiply(int a[][4],int b[][4],int c[][4],int ra ,int ca,int rb ,int cb ) {

if(ca!=rb) cerr<<"矩阵不可乘";

for(int i=0;i

for(int j=0;j

{

int sum=a[i][0]*b[0][j];

for(int k=1;k

sum+=a[i][k]*b[k][j];

c[i][j]=sum;

}

}

void MatrixChain(int *p,int n,int m[][4],int s[][4])

{

for(int i=1;i<=n;i++) m[i][i]=0;//对角线

for(int r=2;r<=n;r++)//外维

for(int i=1;i<=n-r+1;i++)//上三角

{

int j=i+r-1;

m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];

s[i][j]=i;

for(int k=i+1;k

{

int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];

if(t

{

m[i][j]=t;

s[i][j]=k;

}

}

}

}

void Traceback(int i,int j,int s[][4])

{

if(i == j)

{

cout<<"A"<

}

else if(i+1 == j)

{

cout<<"(A"<

}

else

{

cout<<"(";

Traceback(i,s[i][j],s);

Traceback(s[i][j]+1,j,s);

cout<<")";

}

}

int main()

{

int w;

cout<<"矩阵个数:";

cin>>w;

int p[w],s[w][w];

cout<<"输入矩阵A1维数:";

cin>>p[0]>>p[1];

for(int i=2 ; i<=w ; i++)

{

int m = p[i-1];

cout<<"输入矩阵A"<

cin>>p[i-1]>>p[i];

if(p[i-1] != m)

{

cout<

exit(1);

}

}

Traceback(1,w,s);

return 0;

}

运行结果

2、最长公共子序列

#include

#include

#define N 100

using namespace std;

//str1存储字符串x,str2存储字符串y

char str1[N],str2[N];

//lcs存储最长公共子序列

char lcs[N];

//c[i][j]存储str1[1...i]与str2[1...j]的最长公共子序列的长度int c[N][N];

//flag[i][j]==0为str1[i]==str2[j]

//flag[i][j]==1为c[i-1][j]>=s[i][j-1]

//flag[i][j]==-1为c[i-1][j]

int flag[N][N];

//求长度

int LCSLength(char *x, char *y)

{

int i,j;

//分别取得x,y的长度

int m = strlen(x);

int n = strlen(y);

for(i=1;i<=m;i++)

c[i][0] = 0;

for(i=0;i<=n;i++)

c[0][i] = 0;

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

{

if(x[i-1]==y[j-1])

{

c[i][j] = c[i-1][j-1] +1;

flag[i][j] = 0;

}

else if(c[i-1][j]>=c[i][j-1])

{

c[i][j] = c[i-1][j];

flag[i][j] = 1;

}

else

{

c[i][j] = c[i][j-1];

flag[i][j] = -1;

}

}

return c[m][n];

}

//求出最长公共子序列

char* getLCS(char *x, char *y,int len,char *lcs) {

int i = strlen(x);

int j = strlen(y);

while(i&&j)

{

if(flag[i][j]==0)

{

lcs[--len] = x[i-1];

i--;

j--;

}

else if(flag[i][j]==1)

i--;

else

j--;

}

return lcs;

}

int main()

{

int i;

cout<<"请输入字符串x:"<

cin>>str1;

cout<<"请输入字符串y:"<

相关文档
最新文档