Even More Odd Photos:求解 Farmer John 奶牛分组最大组数的算法解析
```cpp #include <iostream> #include <vector> using namespace std; // 检查是否可以分成指定数量的组 bool canPartition(const vector<int>& cows, int numGroups) { int n = cows.size(); // dp[i][j][k] 表示前 i 头奶牛,分成 j 组,当前组的和的奇偶性为 k(0 为偶数,1 为奇数)是否可行 vector<vector<vector<bool>>> dp(n + 1, vector<vector<bool>>(numGroups + 1, vector<bool>(2, false))); dp[0][0][0] = true; for (int i = 1; i <= n; ++i) { for (int j = 0; j <= numGroups; ++j) { for (int k = 0; k < 2; ++k) { // 情况 1:不开始新的组,继续当前组 if (j > 0) { dp[i][j][k ^ (cows[i - 1] % 2)] = dp[i][j][k ^ (cows[i - 1] % 2)] || dp[i - 1][j][k]; } // 情况 2:开始新的组 if (j > 0) { dp[i][j][cows[i - 1] % 2] = dp[i][j][cows[i - 1] % 2] || dp[i - 1][j - 1][1 - k]; } } } } // 检查分成 numGroups 组,最后一组的奇偶性是否符合要求 return dp[n][numGroups][(numGroups - 1) % 2]; } int main() { int n; cin >> n; vector<int> cows(n); for (int i = 0; i < n; ++i) { cin >> cows[i]; } // 二分查找最大组数 int left = 1, right = n; int result = 1; while (left <= right) { int mid = left + (right - left) / 2; if (canPartition(cows, mid)) { result = mid; left = mid + 1; } else { right = mid - 1; } } cout << result << endl; return 0; } ``` 代码解释 1. `canPartition` 函数: - 该函数用于检查是否可以将奶牛分成指定数量的组。 - 使用三维动态规划数组 `dp[i][j][k]` 来记录前 `i` 头奶牛,分成 `j` 组,当前组的和的奇偶性为 `k`(0 为偶数,1 为奇数)是否可行。 - 对于每头奶牛,有两种选择:不开始新的组,继续当前组;或者开始新的组。 - 最后检查分成指定数量的组,最后一组的奇偶性是否符合要求。 2. `main` 函数: - 读取输入的奶牛数量和每头奶牛的品种编号。 - 使用二分查找来找到最大的组数。 - 调用 `canPartition` 函数来检查是否可以分成指定数量的组。 - 输出最大的组数。 复杂度分析 - 时间复杂度:$O(n^2)$,其中 $n$ 是奶牛的数量。 - 空间复杂度:$O(n^2)$,主要用于动态规划数组。 ######[AI问答 | 841点数解答 | 2026-02-03 15:18:32]
- Even More Odd Photos:求解 Farmer John 奶牛分组最大组数的算法解析(字节豆包 | 841点数解答 | 2026-02-03 15:18:32)33
- Comfortable Cows问题:代码实现、解释与复杂度分析(字节豆包 | 956点数解答 | 2026-02-02 17:26:13)54
- C++编程:输入整数判断奇偶与大小并按需输出(字节豆包 | 189点数解答 | 2025-12-13 20:11:55)72
- C++实现:输入整数判断奇偶与大小并输出对应结果(DeepSeek | 123点数解答 | 2025-12-28 14:53:27)51
- C++ 代码:巧妙分离并输出输入整数中的奇数与偶数(字节豆包 | 589点数解答 | 2025-11-26 19:48:05)93
- C++代码深度剖析:整数奇偶数分类输出及优化方案(字节豆包 | 1141点数解答 | 2025-11-26 19:48:54)65
- C++ 代码:巧妙分离并输出输入整数中的奇数与偶数(字节豆包 | 610点数解答 | 2025-11-26 19:49:16)45
- C++ 实现:输入整数判断奇偶与大小并输出对应结果(字节豆包 | 359点数解答 | 2025-11-28 19:55:38)104
- C++ 代码:判断输入整数奇偶性与大小并输出对应结果(字节豆包 | 420点数解答 | 2025-12-27 21:25:35)44
- C++:输入整数判断奇偶与大小并输出对应结果(字节豆包 | 147点数解答 | 2026-01-10 19:35:44)26
- C++实现:计算输入数字各位之和并判断奇偶性(字节豆包 | 439点数解答 | 2026-01-20 20:00:51)56
- 判断输入整数奇偶性与大小的C++代码实现(字节豆包 | 398点数解答 | 2026-03-07 19:45:44)12