您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 算法导论-获取宝石最大值-贪心算法
1.问题描述有m排n列的柱桩,每一排的柱桩从左向右标号为1,2,…,n,且在每个柱桩上预先放好价值不一样的宝石。现在有位杂技演员从第一排的第1号柱桩开始跳跃,每次都必须跳到下一排的柱桩上,且每次跳跃最多只能向左或向右移动一个桩子。也就是说如果现在杂技演员站在第j号桩上,那么他可跳到下一排的第j号桩上,也可跳到下一排的第j-1(ifj1)或者j+1(ifjn)号桩上,并得到桩上的宝石。计算出一条最佳的跳跃顺序,使杂技演员获得的宝石的总价值大。2.递推方程for(i=1;im;i++){for(j=0;jn;j++){if(i=j){t1=i-1;for(t2=j-1;t2=j+1;t2++){if(t2=0&&t2n&&t1=t2){if(Sum[i][j]Sum[i-1][t2]+data[i][j]){Sum[i][j]=Sum[i-1][t2]+data[i][j];}}}}}}3.最优子结构利用贪心算法思想,在每次计算MAX值后加上原值并覆盖原位置的值,这样的话,一个全局最优解就可以通过局部最优解选择来达到。几乎矩阵的每个值都通过贪心算法遍历了一遍,而使用的值都是前一步或几步已经计算并储存好的,因此解决问题的最优解包含了其子问题的最优解,则为该问题的最优子结构。4.程序结构描述总体结构:建立矩阵将矩阵写入test.txt文件找出最大值并通过循环在每个位置(除最后一行)赋予新的值记录路径并输出第一行第一列的值,即得到满足题意的路径及其最大值,将结果写入output.txt文件中。5.复杂度分析由于算法是将整个矩阵(除开第1行)遍历一遍,因此时间复杂度为Θ()。6.测试结果打开test.txt,同文件夹目录下找到output.txt文件打开,显示能够获取宝石最大价值为位置:附:文件源码#includeiostream#includefstream#includestdlib.h#includetime.h#includecstdiousingnamespacestd;intN,n,m;int**data,**Sum,*Arr;intflag,k;voidgetin(){ifstreamfile;charfilename[512];cout文?件t名?为atest.txt,若?输?入?错洙?误ó,?则ò会á跳?出?程ì序ò\n\n输?出?文?件t存?放?在úoutput.txt文?档苔?中D\n\nendl;cout请?输?入?要癮打洙?开a的?文?件t名?:阰endl;cinfilename;file.open(filename,ios::in);if(file.fail()){cout文?件t不?存?在ú!?endl;file.close();cin.get();cin.get();exit(1);}else{ifstreamfin(filename);finmn;data=(int**)malloc(sizeof(int*)*m);Sum=(int**)malloc(sizeof(int*)*m);for(inti=0;i!=m;i++){data[i]=(int*)malloc(sizeof(int)*n);Sum[i]=(int*)malloc(sizeof(int)*n);}Arr=newint[m];cout该?矩?阵ó是?m行Dn?阵óendl;for(inti=0;im;i++){charc;for(intj=0;jn;j++){findata[i][j];coutdata[i][j];if(j!=n-1)finc;Sum[i][j]=data[i][j];}coutendl;}fin.close();}}voidAlgorithm(){inti,j,t1,t2;k=0;for(i=1;im;i++){for(j=0;jn;j++){if(i=j){t1=i-1;for(t2=j-1;t2=j+1;t2++){if(t2=0&&t2n&&t1=t2){if(Sum[i][j]Sum[i-1][t2]+data[i][j]){Sum[i][j]=Sum[i-1][t2]+data[i][j];}}}}}}}voidIn(){intl,j,key;inta,b;key=Sum[m-1][0];for(j=0;jn;j++){if(key=Sum[m-1][j]){key=Sum[m-1][j];l=j;Arr[m-1]=l+1;}}ofstreamoutfile;outfile.open(output.txt);outfile获?取?的?最?大洙?价?值μkeyendl;coutkeyendl;for(inti=m-1;i0;i--){a=Sum[i][l]-data[i][l];for(b=l-1;b=l+1;b++){intt3=i-1;if(b=0&&bn&&t3=b)if(a==Sum[t3][b]){Arr[t3]=b+1;l=b;}}}outfile所ù处鋦位?置?endl;cout所ù处鋦位?置?;for(inti=0;im;i++){outfilei,Arr[i]endl;couti,Arr[i]endl;}outfile.close();}voidmain(){getin();Algorithm();cout可é以?获?得?的?最?多à的?宝纜石骸?数簓目?以?及°所ù处鋦的?位?置?为a:阰endl;In();system(pause);}
本文标题:算法导论-获取宝石最大值-贪心算法
链接地址:https://www.777doc.com/doc-4934495 .html