Advertisement
Dmitriiiiiqiq

Untitled

Mar 12th, 2020
425
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #define MAX 1000000.0
  4. using namespace std;
  5.  
  6. // Structure of a point in 2D plane
  7. struct Point
  8. {
  9. int x, y;
  10. };
  11.  
  12. // Нахождение минимума двух значений
  13. double min(double x, double y)
  14. {
  15. return (x <= y)? x : y;
  16. }
  17.  
  18. // Евклидово расстояние
  19. double dist(Point p1, Point p2)
  20. {
  21. return sqrt((p1.x - p2.x)*(p1.x - p2.x) +
  22. (p1.y - p2.y)*(p1.y - p2.y));
  23. }
  24.  
  25. double GetMinCost(Point points[], int i, int j, int n, double **table) {
  26. //cout << i << " " << j << " " << endl;
  27. if (table[i][j] != -1)
  28. return table[i][j];//рекурсия
  29.  
  30. if ( (i + 1) % n == j ) {
  31. table[i][j] = 0;
  32. return table[i][j]; //мемоизация
  33. }
  34. return 0;
  35. }
  36. // рассчёт стоимости
  37. double cost(Point points[], int i, int j, int k)
  38. {
  39. Point p1 = points[i], p2 = points[j], p3 = points[k];
  40. return dist(p1, p2) + dist(p2, p3) + dist(p3, p1);
  41. }
  42.  
  43. //наилучшая стоимость
  44. double mTCDP(Point points[], int n)
  45. {
  46. // Условие многоугольника!
  47. if (n < 3)
  48. return 0;
  49.  
  50.  
  51. double table[n][n];
  52. //Сохранение результатов.В массив[i][j] сохраняю стоимость от точек i до j
  53. //таблица [0][n-1] - массив окончательных результатов!
  54.  
  55. for (int gap = 0; gap < n; gap++)
  56. {
  57. for (int i = 0, j = gap; j < n; i++, j++)
  58. {
  59. if (j < i+2)
  60. table[i][j] = 0.0;
  61. else
  62. {
  63. table[i][j] = MAX;
  64. for (int k = i+1; k < j; k++)
  65. {
  66. double val = table[i][k] + table[k][j] + cost(points,i,j,k);
  67. if (table[i][j] > val)
  68. table[i][j] = val;
  69. }
  70. }
  71. }
  72. }
  73. return table[0][n-1];
  74. }
  75.  
  76. // Проверка вышеуказанных условий
  77. int main()
  78. {
  79. Point points[] = {{0, 0}, {1, 0}, {2, 1}, {1, 2}, {0, 2}};
  80. int n = sizeof(points)/sizeof(points[0]);
  81. double **table = (double**)malloc(sizeof(double) * n); //сохрание значений и деление на подзадачи
  82. for (int i = 0; i < n; i++) {
  83. table[i] = (double*)malloc(sizeof(double) * n);
  84. for (int j = 0; j < n; j++) {
  85. table[i][j] = -1;
  86. }
  87. }
  88.  
  89. cout << GetMinCost(points, 0, n - 1, n, table) << endl;
  90. for (int i = 0; i < n; i++) {
  91. for (int j = 0; j < n; j++) {
  92. cout << table[i][j] << " " << endl;
  93. }
  94. }
  95. for (int i = 0; i < n; i++) {
  96. free(table[i]);
  97. }
  98. free(table);
  99.  
  100. cout << mTCDP(points, n)<<endl;
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement