Задача с умножением матриц по формуле Глинна для расчета перманента

Рассмотрим такой вход - 3 блока, каждый блок 2 строки, первая строка - количество элементов во втором:

5
13 20 22 43 146
4
13 22 43 146
5
13 43 67 89 146

Проблема: вычислить число целых чисел, которые присутствуют во втором линий всех трех блоков. (Для этого ввода образца выход должен быть 3 до 13, 43 и 146 присутствуют во вторых строках всех трех блоков)

Посмотрите, насколько хорошо этот код:

int main ()
{
    int n, curr;
    map<unsigned, unsigned char> myMap;
    for (int i = 0; i < 3; ++i)
    {
        cin >> n;
        for (int j = 0; j < n; ++j)
        {
            cin >> curr;
            myMap[curr]++;
        }

    }

    unsigned count = 0;
    for (auto it = myMap.begin(); it != myMap.end(); ++it)
    {
        if (it->second == 3)
            ++count;
    }

    cout << count <<endl;
    return 0;
}

Согласно стандарту operator[] возвращается ссылка на (*((insert(make_pair(key, T()))).first)).second. Вот почему я мог написать:

myMap[curr]++;

, и он вставил элемент с ключом curr и инициализировал значение на ноль, если ключ не присутствовал на карте. А также он увеличил значение, несмотря на то, что элемент был на карте или нет.

Посмотрите, как просто? Это хорошо, не так ли? Это хороший пример того, что это действительно удобно.

0
задан mrmarra98x 18 January 2019 в 12:35
поделиться

1 ответ

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

#include <vector>
#include <cassert>

using mat = std::vector<std::vector<double>>;

double permanent(const mat& input_matrix, const mat& sign_matrix)
{
    int m = input_matrix.size();
    assert(m > 2);
    assert(input_matrix[0].size() == m);
    assert(sign_matrix.size() == m);
    int cols = sign_matrix[0].size();
    assert(cols == 1 << (m - 1));

    double result = 0;
    for (int t = 0; t < cols; ++t) {
        double delta = 1;
        for (int k = 0; k < m; ++k) {
            delta *= sign_matrix[k][t];
        }
        double p = 1;
        for (int j = 0; j < m; j++) {
            double s = 0;
            for (int i = 0; i < m; i++) {
                s += sign_matrix[i][t] * input_matrix[i][j];
            }
            p *= s;
        }
        result += delta * p;
    }
    return result / cols;
}

int main()
{
    mat A = { 
        { 1, 4, 7, }, 
        { 2, 5, 8, }, 
        { 3, 6, 9, },
    };
    mat sign_mat = {
        { 1,  1,  1,  1, },
        { 1, -1,  1, -1, },
        { 1,  1, -1, -1, },
    };
    auto perA = permanent(A, sign_mat);
}
0
ответ дан Costantino Grana 18 January 2019 в 12:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: