第一范文网 - 专业文章范例文档资料分享平台

动态规划算法实验报告

来源:用户分享 时间:2025/6/18 17:35:49 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

实验标题

实验目的

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

int sum=a[i][0]*b[0][j]; for(int k=1;k

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<<\ }

else if(i+1 == j)

{

cout<<\ } 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<

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 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:\

cin>>str2;

int lcsLen = LCSLength(str1,str2);

cout<<\最长公共子序列长度:\ char *p = getLCS(str1,str2,lcsLen,lcs); cout<<\最长公共子序列为:\ for(i=0;i

return 0; }

运行结果

3、最大子段和

//分治法求最大子段和 #include using namespace std;

int MaxSubSum(int *a,int left,int right) {

int sum=0;

if(left==right) sum=a[left]>0?a[left]:0; else

{

int center = (left+right)/2;

//最大子段和在左边

int leftsum=MaxSubSum(a,left,center);

//最大子段和在右边

int rightsum=MaxSubSum(a,center+1,right);

//最大子段和在中间 int s1=0;

int lefts=0;

for(int i=center;i>=left;i--) {

搜索更多关于: 动态规划算法实验报告 的文档
动态规划算法实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c4e47a8n1ga9y6ym8bczx_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top