当前位置: 首页 > news >正文

印刷网站建设 优帮云/seo是什么部门

印刷网站建设 优帮云,seo是什么部门,做网站总结作文,站长之家源码之家第一题 有两只猫咪和n条不同类型的鱼,每条鱼都只能被其中一只猫咪吃掉。 下标为i处的鱼被吃掉的得分为: 如果第一只猫咪吃掉,则得分为reward1[i]。如果第二只猫咪吃掉,则得分为reward[i]。 给你一个正整数数组reward1 ,一个正整数数组reward2&#xff0…

第一题

有两只猫咪和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是最高得分。

思路

  • 定义状态:令 dp[i][j] 表示第一只猫咪吃掉 i 条鱼,第二只猫咪吃掉 j 条鱼时,能得到的最大得分。
  • 初始状态:dp[0][0] = 0,表示两只猫咪都没有吃鱼时,得分为 0。
  • 状态转移:对于每一条鱼,有三种选择:
    • 第一只猫咪吃掉,那么 dp[i][j] = dp[i-1][j] + reward1[i+j-1],其中 reward1[i+j-1] 表示第 i+j-1 条鱼的得分。
    • 第二只猫咪吃掉,那么 dp[i][j] = dp[i][j-1] + reward2[i+j-1],其中 reward2[i+j-1] 表示第 i+j-1 条鱼的得分。
    • 两只猫咪都不吃,那么 dp[i][j] = dp[i][j],不改变得分。
    • 取这三种选择中的最大值作为 dp[i][j] 的值。
  • 最终答案:由于题目要求第一只猫咪恰好吃掉 k 条鱼,那么最终答案就是 dp[k][n-k],其中 n 是鱼的总数。
#include <iostream>
#include <vector>
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<n。主办方确保有路线可以成功到达终点地标,为了顺利到达终点,请帮助大壮计算,他需要经过的最少的地标数量。

输入描述:
地标组数
输出描述:
经过最少地标数量

示例1
输入
[2, 1, 1,3, 1, 3, 1, 4]
输出
4

示例2
输入
[5, 4, 3, 2, 1,2, 3, 1, 1, 2]
输出
3

思路:

  • 定义一个变量 ans 表示经过的地标数量,初始为 0。
  • 定义一个变量 cur 表示当前所在的地标编号,初始为 0。
  • 定义一个变量 next 表示下一步要跳到的地标编号,初始为 0。
  • 使用一个 while 循环,当 cur < n - 1 时,执行以下操作:
    • 遍历从 cur + 1 到 cur + nums[cur] 的所有地标编号 i,找出使得 i + nums[i] 最大的那个 i,并赋值给 next。
    • 如果 next == cur,说明无法继续前进,返回 -1 表示无解。
    • 否则,将 cur 更新为 next,并将 ans 加一。
  • 返回 ans 作为最终答案。

根据以上思路,可以用 C++ 语言编写如下代码:

#include <iostream>
#include <vector>
using namespace std;int minLandmarks(vector<int>& nums) {int n = nums.size(); // 地标的总数int ans = 0; // 经过的地标数量int cur = 0; // 当前所在的地标编号int next = 0; // 下一步要跳到的地标编号while (cur < n - 1) { // 当没有到达终点时int max_jump = 0; // 记录能跳到的最远距离for (int i = cur + 1; i <= cur + nums[cur]; i++) { // 遍历所有可选的地标if (i + nums[i] > max_jump) { // 如果能跳得更远max_jump = i + nums[i]; // 更新最远距离next = i; // 更新下一步目标}}if (next == cur) return -1; // 如果无法前进,返回-1表示无解cur = next; // 更新当前位置ans++; // 更新经过的地标数量}return ans; // 返回最终答案
}int main() {vector<int> nums = {2, 1, 1, 3, 1, 3, 1, 4}; // 输入地标组数cout << minLandmarks(nums) << endl; // 输出经过最少地标数量return 0;
}
http://www.jmfq.cn/news/5340673.html

相关文章:

  • 建设网站 法律责任/免费收录网站推广
  • 政府网站建设情况报告/深圳网络推广培训学校
  • 上海知名的网站建设公司/关系网站优化公司
  • 家居网站建设营销推广/360关键词排名推广
  • 苏州城乡建设网站/网站在线生成app
  • 网站建设美国/站长工具高清吗
  • 网站建设费属于无形资产吗/ip网站查询服务器
  • 网站建设工作要求/朋友圈营销
  • 网站建设的内容要怎么写/河北seo技术交流
  • 为什么网站建设价格不一/佛山网站搜索排名
  • 遵义城乡住房建设厅网站/电子商务营销的概念
  • 政协网站建设申请函/整合营销策略
  • 机关网络 网站 建设/googleplay官网
  • 广州技术支持:网站建设/上海网站设计公司
  • 手机投注网站建设/企业网站管理系统
  • 网站建设费需要列入无形资产吗/淘宝运营团队怎么找
  • 单位网站建设存在问题情况汇报/代写文章的平台有哪些
  • 网站建设标准一/网页设计与制作软件
  • 苏州大学网站建设/短视频培训机构排名
  • 怎么建设推广网站/武汉百度开户代理
  • 新网网站建设资料/网络热词
  • 营销网站建设的价格/乐清网站建设
  • 怎样建设学校网站/汕头seo外包平台
  • 深圳网络营销|深圳网站建设公司|专业网络营销运营推广策划公司/抖音营销推广方案
  • 山东省建设业协会网站/网络优化大师手机版
  • 如何加强网站管理的队伍建设/网络营销工具分析
  • 龙华区住房和建设局官方网站/关键词汇总
  • 网站建设一般需要几个步骤/如何做平台推广赚钱
  • 课程网站建设内容/简述获得友情链接的途径
  • 虚拟主机建设网站两个/微信营销方案