LeetCode-day12-2786. 访问数组中的位置使分数最大
LeetCode-day12-2786. 访问数组中的位置使分数最大
- 题目描述
- 示例
- 示例1:
- 思路
- 代码
题目描述
给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。
(图片来源网络,侵删)你 一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置:
如果你当前在位置 i ,那么你可以移动到满足 i
对于你访问的位置 i ,你可以获得分数 nums[i] 。
如果你从位置 i 移动到位置 j 且 nums[i] 和 nums[j] 的 奇偶性 不同,那么你将失去分数 x 。
请你返回你能得到的 最大 得分之和。
注意 ,你一开始的分数为 nums[0] 。
示例
示例1:
输入:nums = [2,3,6,1,9,2], x = 5
输出:13
解释:我们可以按顺序访问数组中的位置:0 -> 2 -> 3 -> 4 。
对应位置的值为 2 ,6 ,1 和 9 。因为 6 和 1 的奇偶性不同,所以下标从 2 -> 3 让你失去 x = 5 分。
总得分为:2 + 6 + 1 + 9 - 5 = 13 。
输入:nums = [2,4,6,8], x = 3
输出:20
解释:数组中的所有元素奇偶性都一样,所以我们可以将每个元素都访问一次,而且不会失去任何分数。
总得分为:2 + 4 + 6 + 8 = 20 。
思路
采用记忆化搜索。
- 如果一个状态(递归入参)是第一次遇到,那么可以在返回前,把状态及其结果记到一个 memo 数组中。
- 如果一个状态不是第一次遇到(memo 中保存的结果不等于 memo 的初始值),那么可以直接返回 memo 中保存的结果。
代码
public long maxScore(int[] nums, int x) { int n = nums.length; long[][] meno = new long[n][2]; for (long[] row : meno) { Arrays.fill(row,-1); } return dfs(0,nums[0]%2,nums,x,meno); } private long dfs(int i, int j, int[] nums, int x, long[][] meno) { if (i == nums.length){ return 0; } if (meno[i][j] != -1){ return meno[i][j]; } if (nums[i] % 2 != j){ return meno[i][j] = dfs(i+1,j,nums,x,meno); } long res1 = dfs(i+1,j,nums,x,meno); long res2 = dfs(i+1,j^1,nums,x,meno); return meno[i][j] =Math.max(res1,res2-x)+nums[i]; }
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
