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