- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
/ztfei/archive/2012/03/31/2426241.html动态规划 最长子串与最大子矩阵问题动态规划与分治的基本思想一致,都是将整个问题分解为子问题,然后解子问题进而求得原问题。然而,两者又有本质的不同:?分治中的子问题相互独立,解得所有子问题后,组合起来就是原问题;动态规划中的子问题不是相互独立的,后一个子问题的解往往要用到前一个子问题的解。这从下面要分析的最长子串问题中可以看得很清楚。动态规划从一个最简单的子问题着手,然后每一步的结果都被保存,供下一个子问题使用。?动态规划只适用于具有最优子结构的问题,即,局部最优解能决定全局最优解。这样,我们才能将其划分为子问题来解决。动态规划总体上来说是一个多阶段决策过程,而且这个决策问题应该具有马尔科夫性,即(下一个决策只与前一个决策有关)。下面提到的最优化原理,就是指“最优过程的部分也一定是最优的”求解步骤最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。最终,我们可以得到下面这个递归式:f(k,x) = h( d, f(k-1,x-1) )其中k表示迭代次数,其中h是求当前最优解的一个函数,f(k,x)表示第k次的最优值,d表示问题变化的量。先把代码贴上来吧,明天再解释。?最长子串:其实,动态规划的思路就是每一步都求子问题的最优解,然后迭代到最后就是整个问题的最优解。求最长子串的思路也一样,我们从串的第一个值开始,每次都选取最大的子串。假设有子串a1,a2.....an ,我们已经求得子串a1......aj(1= j = n)的最长子串是b , 那么我们现在记录b的值,然后计算a1 ....aj,a(j+1)【其实这个子串可以看做是 b, a(j+1)】的最长子串,那么它的最长子串就是 b+a(j+1)和a(j+1) 中的较大者。#include iostream #include vector using namespace std; //最长子串 double longest( vectordouble vect) { vectordouble::iterator iter; double sum = -65535; double b = 0; for ( iter=vect.begin(); iter!=vect.end(); ++iter ) { b = max( b+*iter, *iter); if( bsum ) sum = b; } return sum; } int main( ) { vectordouble vect; vect.push_back(-1); vect.push_back(2); vect.push_back(-3); vect.push_back(9); vect.push_back(1); double sum = longest(vect); cout sum = sum endl; }最大子矩阵,需要调用上面的函数:最大子矩阵的思想与最长子串的思想类似。我们想借助求最长子串的方法来求最大矩阵,假设矩阵为m*n,我们将每一行(总共n个数据)看做一个串,如果求这个串的最大子串,那么就是一个子最优矩阵。其实这里我们还是用了穷举的方法,我们要计算所有这样的串的最长子串。而对于其他子矩阵,我们又怎样将它转化为串呢?这里有一个比较好的方法。将每一个完整的子矩阵(这里完整的意思是n列)的每一行的相同列相加,然后就构成一个子串了呗。但是这里要计算所有子矩阵的最长子串,所以复杂度不是很低,这个还得好好思考有没有更好的方法#include iostream #include vector using namespace std; #define m 5 //行 #define n 6//列 //最大子矩阵 double maxMatrix( double **array )//m*n { double sum = -65535, temp; vectordouble vect(n); for ( int i=0; im; ++i ) { for ( int j=0; jn; ++j ) { vect[j] = 0;//初始化 } for( int j=i; jm; ++j
原创力文档


文档评论(0)