欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

厦门理工学院oj 1106 -- 最佳拍档

程序员文章站 2022-06-01 17:14:23
...

一道简单的dfs+回溯,首先要考虑到一个新的数组c(从学长那里偷的kkkk),c[i][j]表示i号男生与j号女生组成的竞赛优势,dfs中的参数u记录着当前遍历到的第几行,st数组用来存储选取了哪些列,这道题退化成了一道弱化的八皇后问题,即不允许任何一行/一列出现一个以上的元素被选取(即出现一名男生/女生与多名女生/男生配对的情况),当遍历到第n+1行时退出,更新最大值

#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

const int N = 12, M = 110;

int a[N][N], b[N][N], c[N][N];
bool st[N];
int n, m;
int ans;

void dfs(int u, int res)
{
    if(u == n + 1) 
    {
        ans = max(ans, res);
        return;
    }
    for(int i = 1; i <= n; i++)
    {
        if(!st[i])
        {
            st[i] = true;
            dfs(u + 1, res + c[u][i]);
            st[i] = false;
        }
    } 
    return;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            cin >> a[i][j];
        }
    }
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            cin >> b[i][j];
        }
    }
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            c[i][j] = a[i][j] * b[j][i];
        }
    }
    dfs(1, 0);
    cout << ans;
    return 0;
}
相关标签: 厦门理工学院