有两只猫咪和n条不同类型的鱼,每条鱼都只能被其中一只猫咪吃掉。
下标为i处的鱼被吃掉的得分为:
如果第一只猫咪吃掉,则得分为reward1[i]。如果第二只猫咪吃掉,则得分为reward[i]。
给你一个正整数数组reward1 ,一个正整数数组reward2,和一个非负整数k。
请你返回第一只猫咪恰好吃掉k条鱼的情况下,最大得分为多少。
输入
1 1 3 4
4 4 1 1
2
输出
15
说明
这个例子中,第一只猫咪吃掉第2和3条鱼(下标从0于始),第二只猫咪吃掉第0和1条鱼。
总得分为4+4+3+4=15。
15是最高得分。
#include
#include
using namespace std;
int maxScore(vector<int>& reward1, vector<int>& reward2, int k) {
int n = reward1.size(); // 鱼的总数
vector<vector<int>> dp(k + 1, vector<int>(n - k + 1, 0)); // 定义状态数组
for (int i = 0; i <= k; i++) { // 遍历第一只猫咪吃掉的鱼数
for (int j = 0; j <= n - k; j++) { // 遍历第二只猫咪吃掉的鱼数
if (i == 0 && j == 0) continue; // 跳过初始状态
int score = 0; // 记录当前得分
if (i > 0) { // 如果第一只猫咪可以吃掉一条鱼
score = max(score, dp[i-1][j] + reward1[i+j-1]); // 更新得分
}
if (j > 0) { // 如果第二只猫咪可以吃掉一条鱼
score = max(score, dp[i][j-1] + reward2[i+j-1]); // 更新得分
}
dp[i][j] = score; // 更新状态数组
}
}
return dp[k][n-k]; // 返回最终答案
}
int main() {
vector<int> reward1 = {1, 1, 3, 4}; // 输入第一只猫咪的得分数组
vector<int> reward2 = {4, 4, 1, 1}; // 输入第二只猫咪的得分数组
int k = 2; // 输入第一只猫咪要吃掉的鱼数
cout << maxScore(reward1, reward2, k) << endl; // 输出最大得分
return 0;
}
在一个城市探险活动中,主办方标记了n个地标,编号为0到n-1。大壮需要从城市的起点(编号为0的地标)经过一系列地标后,最终到达终点(编号为n-1的地标)。每个地标都对应一个整数,表示从当前地标可以跳过的地标数量。例如,如果小王当前处于编号为i的地标,且地标对于的数字为nums[i],那么他可以选择跳过中间所有地标,而是直接去往任意编号为i用j的地标,其中0<=j= nums[i]且i+j 输入描述: 示例1 示例2 根据以上思路,可以用 C++ 语言编写如下代码:
地标组数
输出描述:
经过最少地标数量
输入
[2, 1, 1,3, 1, 3, 1, 4]
输出
4
输入
[5, 4, 3, 2, 1,2, 3, 1, 1, 2]
输出
3思路:
#include