Динамическое программирование для соответствия размеру (наименьшая разница)

Я нашел эту задачу, который пытается использовать динамическое программирование, чтобы минимизировать абсолютную разницу между ростом для n мальчиков и m девочек в матче.

Если я правильно понимаю, мы будем сортировать первых j мальчиков и k девочек по росту (по возрастанию? или по убыванию?), где j‹=k. Почему j ‹=k?

Я не понимаю, как я могу использовать повторение, упомянутое в ссылке:

(j,k−1) and (j−1,k−1)

найти оптимальное соответствие для значений (j,k) в зависимости от того, соединяете ли вы мальчика j с девочкой k или нет.

Я явно неправильно понимаю некоторые вещи, но моя цель - написать псевдокод для этого решения. Вот мои шаги:

1. Sort heights Array[Boys] and Array[Girls]
2. To pair Optimally for the least absolute difference in height, simply pair in order so Array[Pairs][1] = Array[Boys][1] + Array[Girls][1]
3. Return which boy was paired with which girl

Пожалуйста, помогите мне реализовать решение, предложенное в ссылке.


person Nico Heinze    schedule 31.03.2016    source источник


Ответы (2)


Как указано в предоставленном вами ответе, всегда есть лучшее совпадение, если между двумя совпадениями есть пересечение, когда рост отсортирован для всех мальчиков и всех девочек в порядке возрастания.

Таким образом, возможно решение динамического программирования со сложностью O(n*m).

Итак, у нас есть состояние, представленное двумя индексами, назовем их i и j, где i относится к мальчикам, а j относится к девочкам, тогда в каждом состоянии (i, j) мы можем сделать переход в состояние (i, j+1), т.е. текущий ith мальчик делает не выбирать текущую jth девочку или можно сделать ход в состояние (i+1, j+1), т.е. текущая jth девочка выбирается текущим ith мальчиком и мы выбираем минимум между этими двумя вариантами на каждом уровне.

Это можно легко реализовать с помощью решения DP.

Повторение:

DP[i][j] = minimum(
                    DP[i+1][j+1] + abs(heightOfBoy[i] - heightofGirl[j]),
                    DP[i][j+1] 
               );

Ниже приведен код на С++ для рекурсивного решения DP:

#include<bits/stdc++.h>
#define INF 1e9

using namespace std;

int n, m, htB[100] = {10,10,12,13,16}, htG[100] = {6,7,9,10,11,12,17}, dp[100][100];

int solve(int idx1, int idx2){
    if(idx1 == n) return 0;
    if(idx2 == m) return INF;

    if(dp[idx1][idx2] != -1) return dp[idx1][idx2];

    int v1, v2;

    //include current
    v1 = solve(idx1 + 1, idx2 + 1) + abs(htB[idx1] - htG[idx2]);

    //do not include current
    v2 = solve(idx1, idx2 + 1);

    return dp[idx1][idx2] = min(v1, v2);
}


int main(){

    n = 5, m = 7;
    sort(htB, htB+n);sort(htG, htG+m);
    for(int i = 0;i < 100;i++) for(int j = 0;j < 100;j++) dp[i][j] = -1;
    cout << solve(0, 0) << endl;
    return 0;
}

Output : 4

Ссылка на решение в Ideone: http://ideone.com/K5FZ9x

Вывод таблицы DP приведенного выше решения:

 4        4        4        1000000000      1000000000      1000000000       1000000000       
-1        3        3        3               1000000000      1000000000       1000000000       
-1       -1        3        3               3               1000000000       1000000000       
-1       -1       -1        2               2               2                1000000000       
-1       -1       -1       -1               1               1                1 

Ответ хранится в состоянии DP[0][0].

person uSeemSurprised    schedule 31.03.2016
comment
Повторение, упомянутое в ссылке, предоставленной OP, - это то же самое повторение, которое я написал, только topological order of evaluation отличается. - person uSeemSurprised; 31.03.2016
comment
Благодарю вас! Есть идеи, как будет выглядеть базовый вариант в нарисованной матрице и от каких мест зависит запись? Это поможет визуализации. - person Nico Heinze; 31.03.2016
comment
Я предполагаю, что рекурсия могла быть использована в качестве альтернативы. почему динамическое программирование оказалось хорошим решением? - person Nico Heinze; 01.04.2016
comment
Рекурсивное решение было бы экспоненциальным по сложности, что было бы очень неэффективно. - person uSeemSurprised; 01.04.2016

Вы можете превратить эту задачу в двудольный граф, где граница между девочкой и мальчиком представляет собой абсолютную разницу между их ростом, например abs(hG - hB). Затем вы можете использовать алгоритм двудольного сопоставления для поиска минимального сопоставления. См. здесь для получения дополнительной информации http://www.geeksforgeeks.org/maximum-bipartite-matching/< /а>

person gabesoft    schedule 31.03.2016