用C语言写一个 收益最大化 有n个格子,每个格子里放着不定价值的金币。你可以拿走格子里的金币,但是不能连续拿两个格子里的金币。 请给出最多能拿走多少价值的金币。 输入说明: 第一行输入格子的个数n 第二行依次输入每个格子里的金币价值 输入说明: 最多能拿走多少价值的金币 输入示例: 4 1 2 3 1 输出示例: 4
时间: 2024-02-20 19:58:08 浏览: 20
以下是用动态规划算法实现的 C 语言代码:
```c
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, coins[1000], dp[1000] = {0};
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &coins[i]);
}
dp[0] = coins[0];
dp[1] = max(coins[0], coins[1]);
for (int i = 2; i < n; i++) {
dp[i] = max(dp[i - 1], dp[i - 2] + coins[i]);
}
printf("%d", dp[n - 1]);
return 0;
}
```
具体思路如下:
1. 定义一个 `dp` 数组,其中 `dp[i]` 表示前 `i` 个格子中收益最大化的结果。
2. 初始状态为 `dp[0] = coins[0]`,即只有一个格子时只能拿这个格子里的金币。
3. 当有两个格子时,如果第一个格子的金币价值大于第二个格子的金币价值,那么最优解就是拿第一个格子里的金币;否则最优解就是拿第二个格子里的金币。
4. 当有三个及以上的格子时,每个格子都有两种选择:拿或不拿。如果选择拿当前格子里的金币,那么前一个格子就不能拿,所以最大收益为前两个格子中收益最大的加上当前格子里的金币价值;如果选择不拿当前格子里的金币,那么前一个格子就可以拿,所以最大收益为前一个格子中的最大收益。因此,状态转移方程为 `dp[i] = max(dp[i - 1], dp[i - 2] + coins[i])`。
5. 最终结果为 `dp[n - 1]`,即前 `n` 个格子中收益最大化的结果。