洛谷题解:SP6828 LINEUP - Lineup

题目传送门。

题意


给定 C C C,表示有 C C C 11 × 11 11 \times 11 11×11 的矩阵,每一行表示某个球员在每个位置上的能力值,求 11 11 11 个球员能力值最大是多少。

分析


使用比较水的 dfs 进行解答。

现在用 k k k 表示第 k k k 个位置,用 c n t cnt cnt 表示当前到这个位置之前所有的能力值之和。

很简单的思路:

  • 从第 1 1 1 行开始搜索,判断每一行的每一个位置是否大于 0 0 0,以及是否搜索过。如果成功进入判断,就标记当前位置,然后当前位置加 1 1 1,能力值总和加上当前能力值,继续搜索,再回溯。

  • 当超过了 11 11 11 行的时候,使用 a n s ans ans 记录最大的能力值总和即可。

Code


#include <cstdio>
#include <cstring>
using namespace std;
bool bz[12];
int C, ans, a[17][17];
// 深搜 
void dfs (int, int);
int main() {
	// C 组数据 
	scanf ("%d", &C);
	while (C--) {
		// 答案清零 
		ans = 0;
		// 初始化标记数组 
		memset (bz, 0, sizeof(bz));
		// 输入 
		for (int i = 1; i <= 11; i++) {
			for (int j = 1; j <= 11; j++)
				scanf ("%d", &a[i][j]);
		}
		// 调用深搜 
		dfs (1, 0);
		// 输出答案 
		printf ("%d\n", ans);
	}
	return 0;
}
void dfs (int k, int cnt) {
	// 全部搜完 
	if (k > 11) {
		// 更新答案 
		if (cnt > ans)
			ans = cnt;
		// 返回 
		return;
	}
	// 循环 11 行 
	for (int i = 1; i <= 11; i++) {
		// 判断第 i 行第 k 个位置是否不为 0,以及是否搜索过 
		if (a[i][k] > 0 && bz[i] == 0) {
			// 标记 
			bz[i] = 1;
			// 下一个位置,加上当前能力值 
			dfs (k + 1, cnt + a[i][k]);
			// 回溯 
			bz[i] = 0;
		}
	}
}

完结撒花。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值