【发布时间】:2020-08-24 02:07:05
【问题描述】:
我有n 点并且必须找到k 点之间的最大联合区域(k <= n)。因此,它是这些点面积的总和减去它们之间的公共面积。
]1
假设我们有n=4, k=2。如上图所示,面积是从每个点到原点计算的,最终面积是B面积与D面积之和(只计算它们相交的面积一次)。没有一点被支配
我已经实现了一个自下而上的动态规划算法,但它在某处有错误。这是打印出最佳结果的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct point {
double x, y;
} point;
struct point *point_ptr;
int n, k;
point points_array[1201];
point result_points[1201];
void qsort(void *base, size_t nitems, size_t size,
int (*compar)(const void *, const void *));
int cmpfunc(const void *a, const void *b) {
point *order_a = (point *)a;
point *order_b = (point *)b;
if (order_a->x > order_b->x) {
return 1;
}
return -1;
}
double max(double a, double b) {
if (a > b) {
return a;
}
return b;
}
double getSingleArea(point p) {
return p.x * p.y;
}
double getCommonAreaX(point biggest_x, point new_point) {
double new_x;
new_x = new_point.x - biggest_x.x;
return new_x * new_point.y;
}
double algo() {
double T[k][n], value;
int i, j, d;
for (i = 0; i < n; i++) {
T[0][i] = getSingleArea(points_array[i]);
}
for (j = 0; j < k; j++) {
T[j][0] = getSingleArea(points_array[0]);
}
for (i = 1; i < k; i++) {
for (j = 1; j < n; j++) {
for (d = 0; d < j; d++) {
value = getCommonAreaX(points_array[j - 1], points_array[j]);
T[i][j] = max(T[i - 1][j], value + T[i - 1][d]);
}
}
}
return T[k - 1][n - 1];
}
void read_input() {
int i;
fscanf(stdin, "%d %d\n", &n, &k);
for (i = 0; i < n; i++) {
fscanf(stdin, "%lf %lf\n", &points_array[i].x, &points_array[i].y);
}
}
int main() {
read_input();
qsort(points_array, n, sizeof(point), cmpfunc);
printf("%.12lf\n", algo());
return 0;
}
输入:
5 3
0.376508963445 0.437693410334
0.948798695015 0.352125307881
0.176318878234 0.493630156084
0.029394902328 0.951299438575
0.235041868262 0.438197791997
其中第一个数字等于n,第二个数字等于k,以下几行分别是每个点的x和y坐标,结果应该是:0.381410589193,
而我的是0.366431740966。所以我错过了一点?
【问题讨论】:
-
我确定这只是我,但是当你写“[..] 它是这些点面积的总和减去它们之间的公共面积”时,我不知道你的意思是什么.一个点通常没有面积。如果您可以用一个简单的示例图为我绘制此图,我相信问题会立即变得更加清晰!
-
@N.Wouda 我可以看到它会令人困惑,没有很好地解释。添加了一张图片以进行澄清并更新了我的意思
-
@Michael.leaves77 为什么最后的区域只是 B 和 D 的并集而忽略了 A 和 C?
-
@FelixG 因为即使我们有 4 个点 (
n),我们也必须仅使用k点找到最大面积。在这种情况下,k是 2。 -
@WeatherVane 是的,这正是我的描述所实现的。
标签: c algorithm dynamic-programming bottom-up