题解(请关注+题解点赞,球球了)
2025-07-24 18:20:16
发布于:上海
6阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
// 扩展数组处理环形结构
vector<int> nums_extended = nums;
nums_extended.insert(nums_extended.end(), nums.begin(), nums.end());
// 计算前缀和数组
vector<int> prefix_sum(2 * n + 1, 0);
for (int i = 1; i <= 2 * n; ++i) {
prefix_sum[i] = prefix_sum[i - 1] + nums_extended[i - 1];
}
int min_ans = INT_MAX;
int max_ans = INT_MIN;
// 枚举所有可能的起点
for (int s = 0; s < n; ++s) {
// 创建动态规划数组,f_min[i][j]表示前j个元素分成i部分的最小乘积
vector<vector<int>> f_min(m + 1, vector<int>(n + 1, INT_MAX));
vector<vector<int>> f_max(m + 1, vector<int>(n + 1, INT_MIN));
// 初始化:0部分的乘积为1
f_min[0][0] = 1;
f_max[0][0] = 1;
// 动态规划填充表格
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
for (int k = 0; k < j; ++k) {
// 计算区间[k,j)的和模10的结果
int sum_val = (prefix_sum[s + j] - prefix_sum[s + k]) % 10;
if (sum_val < 0) sum_val += 10; // 处理负数取模
// 更新最小值
if (f_min[i - 1][k] != INT_MAX) {
f_min[i][j] = min(f_min[i][j], f_min[i - 1][k] * sum_val);
}
// 更新最大值
if (f_max[i - 1][k] != INT_MIN) {
f_max[i][j] = max(f_max[i][j], f_max[i - 1][k] * sum_val);
}
}
}
}
// 更新全局结果
if (f_min[m][n] != INT_MAX) {
min_ans = min(min_ans, f_min[m][n]);
}
if (f_max[m][n] != INT_MIN) {
max_ans = max(max_ans, f_max[m][n]);
}
}
cout << min_ans << endl;
cout << max_ans << endl;
return 0;
}
这里空空如也
有帮助,赞一个