1. 题目分析与解题思路
这道USACO竞赛题的核心在于理解题目描述的约束条件并找到最优解。题目要求在一个N×N的棋盘上放置奶牛,满足两个条件:
- 每个格子最多放一头奶牛
- 任何2×2的子区域必须恰好有2头奶牛
通过分析样例,我们可以发现合法的放置模式实际上只有两种基本排列方式:棋盘式的交替放置或者行列式的交替放置。这个发现是解题的关键突破口。
1.1 约束条件的数学转化
题目中2×2子区域必须恰好2头奶牛的条件,实际上限制了相邻格子的放置关系。经过推导可以得出以下结论:
- 在同一行中,奶牛放置必须间隔一个格子(如C.C.或.C.C)
- 在同一列中,奶牛放置也必须间隔一个格子
- 但行和列的间隔模式可以独立选择
这意味着我们可以将问题转化为:选择行模式或列模式中的一种,然后按照该模式计算最大美丽度。
1.2 两种可行模式的证明
通过数学归纳法可以证明,满足题目条件的放置方式只有两种基本模式:
- 行交替模式:每行内部间隔放置,相邻行错开一位
- 列交替模式:每列内部间隔放置,相邻列错开一位
任何其他放置方式要么违反2×2子区域的约束,要么可以分解为这两种模式的组合。因此我们只需要计算这两种模式下的最大美丽度,然后取较大值即可。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与实现细节
2.1 行交替模式的计算
行交替模式有两种子模式:
- 奇数行从第一列开始间隔放置
- 奇数行从第二列开始间隔放置
对于每行,我们需要计算这两种子模式下的美丽度之和,然后选择较大者累加到总和中。
cpp复制int row_sum(int i, int type) {
int res[2] = {0, 0};
for(int j = 1; j <= n; j++)
res[j & 1] += a[i][j];
return res[type];
}
这个函数计算第i行在指定模式下的美丽度总和。type=0表示从第1列开始,type=1表示从第2列开始。
2.2 列交替模式的计算
类似地,列交替模式也有两种子模式:
- 奇数列从第一行开始间隔放置
- 奇数列从第二行开始间隔放置
对于每列,我们计算这两种子模式下的美丽度之和,选择较大者累加。
cpp复制int line
