小明会从第一个食材开始做菜。每做完一个菜,后面食材的新鲜度就会减一。现在小明想知道当做完所有的菜的时候,能获得最大的新鲜度的和是多少? 题目中会给你一个整数数组 num,代表每一个食材的新鲜度,现在请你编写代码,帮小明计算,到最后能获得的新鲜度的和是多少 用c语言进行
时间: 2024-10-16 16:11:30 浏览: 17
用一个故事讲完CPU的工作原理
这个问题是一个典型的动态规划问题,可以使用“背包”或者“滑动窗口”的思想来解决。我们需要维护两个变量:当前的最大新鲜度之和(maxSum),以及剩余食材中最新鲜的那部分食材所能带来的最大新鲜度(bestFreshness)。遍历食材数组,每次更新这两个值:
1. 如果当前食材的新鲜度大于等于0,将其加入到总和中,并将bestFreshness设置为这个食材的新鲜度;
2. 否则,只考虑剩余食材中新鲜度更大的那一部分,因为负值的食材只会减少总和。
当遍历完整个数组后,maxSum就是所求的答案。以下是简单的C语言代码实现:
```c
#include <stdio.h>
int maxFreshness(int* nums, int n) {
if (n == 0) return 0;
int maxSum = nums[0];
int bestFreshness = nums[0];
for (int i = 1; i < n; i++) {
// 更新当前最大和
maxSum = nums[i] > 0 ? maxSum + nums[i] : maxSum;
// 更新剩余食材中最佳新鲜度
bestFreshness = nums[i] >= 0 ? nums[i] : bestFreshness;
}
// 回溯取最优解
return maxSum + bestFreshness;
}
int main() {
int num[] = {5, -2, 6, 3};
int n = sizeof(num) / sizeof(num[0]);
printf("The maximum freshness sum is: %d\n", maxFreshness(num, n));
return 0;
}
```
在这个例子中,我们假设数组`num`存储了食材新鲜度,函数`maxFreshness`接受这个数组和长度`n`作为输入。运行程序,会得到最后可以获得的最大新鲜度之和。
阅读全文