C++动态规划

谁能教我一下C++的动态规划我不是太懂谁能帮我搞懂了我给50最好快点在11月半之前11月27号就是考试了帮帮忙啊(详细点不要发概念或者只发一个程序段)... 谁能教我一下C++的动态规划 我不是太懂 谁能帮我搞懂了我给50 最好快点在11月半之前 11月27号就是考试了 帮帮忙啊 (详细点 不要发概念或者只发一个程序段) 展开
 我来答
匿名用户
推荐于2016-04-15
展开全部
矩阵相乘动态规划
1.基本思想

在比较基本的算法设计思想里,动态规划是比较难于理解,难于抽象的一种,但是却又十分重要。动态规划的实质是分治思想和解决冗余,因此它与分治法和贪心法类似,它们都是将问题的实例分解为更小的、相似的子问题,但是动态规划又有自己的特点。

贪心法的当前选择可能要依赖于已经作出的选择,但不依赖于还未做出的选择和子问题,因此它的特征是由顶向下,一步一步地做出贪心选择,但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解。相比而言,动态规划则可以处理不具有贪心实质的问题。

在用分治法解决问题时,由于子问题的数目往往是问题规模的指数函数,因此对时间的消耗太大。动态规划的思想在于,如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,如果我们能够保存已经解决的子问题的答案,而在需要的时候再找出已求得的答案,这样就可以避免大量的重复计算。由此而来的基本思路是,用一个表记录所有已解决的子问题的答案,不管该问题以后是否被用到,只要它被计算过,就将其结果填入表中。

比较感性的说,其实动态规划的思想是对贪心算法和分治法的一种折衷,它所解决的问题往往不具有可爱的贪心实质,但是各个子问题又不是完全零散的,这时候我们用一定的空间来换取时间,就可以提高解题的效率。

2.程序

#include "iostream.h"

#include "stdio.h"

#define N 5

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

{

if(i==j)return;

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

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

cout<<"Multiply A"<<i<<","<<s[i][j];

cout<<"and A"<<(s[i][j]+1)<<","<<j<<endl;

}

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

{ int i,r,j,k,t;

for(i=1;i<=n;i++)m[i][i]=0;

for(r=2;r<=n;r++)

for(i=1;i<=n-r+1;i++)

{j=i+r-1;<br/><br/>m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];<br/><br/>s[i][j]=i;<br/><br/>for(k=i+1;k<j;k++)<br/><br/>{ t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; <br/><br/>if(t<m[i][j])<br/><br/>{m[i][j]=t;<br/><br/>s[i][j]=k;<br/><br/>}

}

}

}

void main()

{

cout<<"动态规划求矩阵连乘计算次序最优解:\n";

int s[N][N];

int p[N];

int m[N][N];

int i;

cout<<"初始化N=5个矩阵行列数:\n";

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

cin>>p[i];

cout<<"输出结果:\n";

MatrixChain(p,N,m,s);

Traceback(1,N,s);

}
匿名用户
2013-09-03
展开全部
http://dev.21tx.com/2005/05/05/11352.html你上这个看看。对你有帮助吧!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式