本文共 1140 字,大约阅读时间需要 3 分钟。
#includeusing namespace std;typedef long long LL;const int N = 5e3 + 5;const LL INF = 0x3f3f3f3f;LL a[N], dp[N], pre[N];int main() { int n, m; scanf("%d%d", &n, &m); int num = 0; LL ans = 0; for (int i = 1; i <= n; ++i) { scanf("%lld", &a[i]); if (a[i] > 0) { ans += a[i]; num++; } } if (num <= m) { printf("%lld\n", ans); } else { for (int i = 1; i <= m; ++i) { ans = -INF; for (int j = 1; j <= n; ++j) { if (j == 1) { dp[j] = a[j]; } else { dp[j] = max(pre[j-1], dp[j-1]) + a[j]; } pre[j-1] = ans; ans = max(ans, dp[j]); } pre[n] = ans; } printf("%lld\n", pre[n]); } return 0;}
上述代码实现了一个动态规划算法,主要用于解决两个变量的问题。代码首先读取输入值n和m,然后读取数组a中的元素。对于数组a中的正数元素,程序会将它们累加到总和ans
中,并统计这些正数的数量num
。
如果num
小于等于给定的m值,程序直接输出当前的ans
值。如果num
大于m值,程序将使用动态规划的方法来求解最优解。在动态规划部分,程序维护了两个辅助数组dp
和pre
,分别用于存储当前状态和前一步的最大值。通过遍历数组a,程序逐步构建最优解,并更新最大值ans
。最后,程序输出最终的最大值。
整个算法的时间复杂度主要取决于数组a的长度n,复杂度为O(n*m),适用于较小规模的n和m值。
转载地址:http://gnaoz.baihongyu.com/