收藏 分享(赏)

算法分析与设计(李清勇)课后习题答案.doc

上传人:精品资料 文档编号:10698130 上传时间:2019-12-29 格式:DOC 页数:16 大小:68.52KB
下载 相关 举报
算法分析与设计(李清勇)课后习题答案.doc_第1页
第1页 / 共16页
算法分析与设计(李清勇)课后习题答案.doc_第2页
第2页 / 共16页
算法分析与设计(李清勇)课后习题答案.doc_第3页
第3页 / 共16页
算法分析与设计(李清勇)课后习题答案.doc_第4页
第4页 / 共16页
算法分析与设计(李清勇)课后习题答案.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、5-1 凸多边形 最优三角剖分问题/3d5 凸多边形最优三角剖分#include “stdafx.h“#include using namespace std; const int N = 7;/凸多边形边数+1int weightN = 0,2,2,3,1,4,2,0,1,5,2,3,2,1,0,2,1,4,3,5,2,0,6,2,1,2,1,6,0,1,4,3,4,2,1,0;/凸多边形的权int MinWeightTriangulation(int n,int *t,int *s);void Traceback(int i,int j,int *s);/构造最优解int Weight(i

2、nt a,int b,int c);/权函数int main()int *s = new int *N; int *t = new int *N; for(int i=0;i#include #include “string.h“#define Max 101using namespace std;int DMaxMax;int num;int MaxSum(int num)int i, j;for(i = num - 1; i = 1; i -)for(j = 1; j num;for(i = 1; i Dij;cout using namespace std;#define N 210in

3、t costNN;int mN;int main()int n,i,j;while(cinn)for(i=1;icostij;m1=0;int min;for(i=2;i 1. using namespace std; 2. 3. /用于保存子问题最优解的备忘录 4. typedef struct 5. 6. int maxlen; /当前子问题最优解 7. int prev; /构造该子问题所用到的下一级子问题序号(用于跟踪输出最优队列) 8. Memo; 9. 10. /用于递归输出 Memo B 中的解 11. void Display(int* A, Memo* M, int i) 1

4、2. 13. if (Mi.prev = -1) 14. 15. cout=0; j-) /查看前面的子问题 找出满足条件的最优解 并且记录 41. 42. if (Ajmax) 43. 44. max = Bj.maxlen+1; /跟踪当前最优解 45. Bi.prev = j; /跟踪构造路径 46. 47. 48. Bi.maxlen = max; /构造最优解 49. 50. 51. for (i=n-1; i0; i-) 52. 53. int max=1; 54. for (int j=i; jmax) /比当前长度更长 记录并构造58. 59. max = Cj.maxlen+

5、1; 60. Ci.prev = j; 61. 62. 63. Ci.maxlen = max; 64. 65. 66. /遍历 i 得到最大的 Bi+Ci-1(-1 是因为我们在 Bi和 Ci中 均加上了 Ai这个数 因此需要减去重复的) 67. int maxQuence = 0; /记录当前最优解 68. int MostTall; /记录 i 用于跟踪构造路径 69. for (i=0; i maxQuence) 72. 73. maxQuence = Bi.maxlen+Ci.maxlen-1; 74. MostTall = i; 75. 76. 77. 78. coutn; 100

6、. 101. A = new intn; 102. coutAi; 106. 107. GetBestQuence(A, n); 108. delete A; 109. return 0; 110. 5-7 买票问题状态转移方程是 fi := min(fi - 1 + ti, fi - 2 + ri - 1); i = 2 n初值 f0 := 0; f1 := t1;constmaxn = 1000;var i, j, n : longint;f, t, r : array0maxn of longint;function min(a, b : longint) : longint;begin

7、 if a fi-1+Ti then 7 fi fi-1+Ti8 return f5-8 最大子段和问题#include #include int max_sum(int n,int *a,int *besti,int *bestj)int *b = (int *)malloc(n * sizeof(int);int sum = 0;int i = -1;int temp = 0;for (i=0;i 0) temp += ai;elsetemp = ai;bi = temp;sum = b0;for (i=1;i= 0;i-) if (bi = ai) *besti = i;break;fr

8、ee(b);return sum; int main(void)int a = -2,1,-4,13,-5,-2,-10,20,100;int length = sizeof(a)/sizeof(int);int sum = -1;int besti = -1;int bestj = -1;sum = max_sum(length,a,printf(“besti = %d,bestj = %d,max_sum=%dn“,besti,bestj,sum);return 0;5-9 装箱问题发现就是 0-1 背包问题 每个物品的体积就是花费同时也是价值, 也就是说这题可以转化为在总体积为 w 下,

9、可以得到最大的价值 最后用总体积减去最大的价值就是剩下最少的空间 状态转移方程 dj = max(dj, dj - ai + ai);第二行为一个整数,表示有 n 个物品;接下来 n 行,每行一个整数表示这 n 个物品的各自体积。 输出格式 一个整数,表示箱子剩余空间。#include #include using namespace std;int n;int d20005;int a35;int main()int w;scanf(“%d%d“, int i, j;for (i = 0; i = ai; j-)dj = max(dj, dj - ai + ai);printf(“%dn“,

10、 w - dw);return 0;6-10 表格乘法#include “stdio.h“#define num 50void chengji_1(int (*a)num3,int n,char b);int _tmain( )int anumnum3;char bnum;int i,j,k,n;char c;printf(“intput the num of array:“);scanf(“%d“,getchar();for(i=0;iusing namespace std;int data102102,longetr102102;int m,n;int cal(int i,int j)in

11、t max = 0;if (longetrij 0)/如果该点已经计算过直接返回路径长度,保存已有的计算结果这是动态规划优越之处return longetrij;if(j-1 = 0 int maxway = 0;for ( i=0;idataij;longetrij = 0;for ( i=0;i#include#include#includeusing namespace std;struct dot/创建一个结构体存储每个点的信息int x;int y;int h;dot line20000; /将每个点存入该结构体数组int height120120; /用于存储 inputint l

12、en120120; /dp 数组,存储每个点的最优解int cmp( const void *a ,const void *b) /快速排序的参考函数if(*(dot *)a).h(*(dot *)b).h)return 1;else return -1;int main ()int m,n;cinmn;int i,j;int flag=-1;int max=0;for(i=1;i=lenlinei.xlinei.y+1)lenlinei.xlinei.y+1=lenlinei.xlinei.y+1;if(heightlinei.xlinei.y=lenlinei.x+1linei.y)len

13、linei.x+1linei.y=lenlinei.xlinei.y+1;if(heightlinei.xlinei.y=lenlinei.xlinei.y-1)lenlinei.xlinei.y-1=lenlinei.xlinei.y+1;if (heightlinei.xlinei.y=lenlinei.x-1linei.y)lenlinei.x-1linei.y=lenlinei.xlinei.y+1; /动态规划过程for(i=1;imax)max=lenij; /遍历 len 数组,求出最大值cout2 using namespace std;3 4 int * a;5 int *s

14、um;6 int max_array(int *a,int n)7 8 int *c = new int n;9 int i =0;10 c0 = a0;11 for(i=1;imax_sum)21 max_sum = ci;22 delete c;23 return max_sum;24 25 26 int max_matrix(int n)27 28 int i =0;29 int j = 0;30 int max_sum = -65535;31 int * b = new int n;32 33 for(i=0;i max_sum)43 max_sum = sum;44 45 46 de

15、lete b;47 return max_sum;48 49 int main()50 51 int n;52 cin n;53 54 a = new int *n;55 sum = new int *n;56 int i =0;57 int j =0;58 for(i=0;iaij;65 sumij =0 ;/sumrk表示起始和结尾横坐标分别为 r,k 时的最大子矩阵66 /sumrk = maxsum (aij):r=i=k:0=k=n-167 68 69 /*70 int b10=31,-41,59,26,-53,58,97,-93,-23,84;71 cout max_array(b,10) endl;72 */73 cout max_matrix(n);74

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报