第一个人放在位置4,发挥15的能力值
第二个人放在位置2,发挥15的能力值
第三个人放在位置1,发挥15的能力值
第四个人放在位置3,发挥114000的能力值
第五个人放在位置5,发挥469的能力值
团队总能力值:15+15+15+114000+469=114514
思路:五个位置每个位置选前5个最强者 共25人(有重复)
然后深搜出最大值 (要用到visit数组)
#include <bits/stdc++.h> using namespace std; #define ll long long bool vis[100005]; ll co[100005][6]; ll mmax[6][6], ans = 0; void dfs(int now, ll tmp){//now 第几列 一列一列看 if(now == 6){ ans = max(ans, tmp); return;//一定要return 即不进行下面的for循环 } for(int i = 1; i <= 5; i++){ if(vis[mmax[i][now]]) continue;//看该行是否visit过 vis[mmax[i][now]] = 1; dfs(now + 1, tmp + co[mmax[i][now]][now]); vis[mmax[i][now]] = 0; } } /*mmax[i][j] 第j列 第i大的数 所属阵营(即第几行) mmax数组 4 4 4 5 5 3 2 5 1 4 5 1 3 3 3 1 3 1 2 1 2 5 2 4 2 */ int main(){ ll n; cin >> n; for(int i = 1; i <= n; i++) { for(int j = 1; j <= 5; j++) { cin >> co[i][j]; for(int pos = 1; pos <= 5; pos++)//从前往后判断 是否比存在里面的数要大 { if(co[i][j] > co[mmax[pos][j]][j]) { for(int k = 5; k >= pos + 1; k--)//大就往后推 并退出循环 mmax[k][j] = mmax[k-1][j]; mmax[pos][j] = i; break; } } } } dfs(1, 0); cout << ans << endl; }