算法Day34 找数游戏

找数游戏

Description

小明有一个整数数组nums,他希望找出并返回能被三整除的元素最大和。你能找出符合要求的数。

Input

输入整数数组nums的各个元素,数字间用“,”相隔。
1≤nums.length≤10
1≤nums[i]≤10^4

Output

输出能被3整除的元素最大和,无符合要求的元素则输出0。

Sample

在这里插入图片描述

代码

import java.util.ArrayList;
import java.util.Scanner;

import static java.lang.Math.max;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        ArrayList<Integer> arrayList = new ArrayList<>();
        int a = 0;
        String[] s = in.nextLine().split(",");
        for(int i = 0;i<s.length;i++){
            arrayList.add(Integer.parseInt(s[i]));
        }
        System.out.println(maxSumDivThree(arrayList));

    }
    public static int maxSumDivThree(ArrayList<Integer> nums) {
        int n = nums.size();
        int dp[][] = new int[n+2][3];
        dp[0][0] = 0; dp[0][1] = Integer.MIN_VALUE; dp[0][2] = Integer.MIN_VALUE;
        for(int i = 1;i <= n;i++)
        {
            int t = nums.get(i-1)%3;
            if(t == 0)
            {
                dp[i][0] = max(dp[i-1][0], dp[i-1][0] + nums.get(i-1));
                dp[i][1] = max(dp[i-1][1], dp[i-1][1] + nums.get(i-1));
                dp[i][2] = max(dp[i-1][2], dp[i-1][2] + nums.get(i-1));
            }
            else if(t == 1)
            {
                dp[i][0] = max(dp[i-1][0], dp[i-1][2] + nums.get(i-1));
                dp[i][1] = max(dp[i-1][1], dp[i-1][0] + nums.get(i-1));
                dp[i][2] = max(dp[i-1][2], dp[i-1][1] + nums.get(i-1));
            }
            else if(t == 2)
            {
                dp[i][0] = max(dp[i-1][0], dp[i-1][1] + nums.get(i-1));
                dp[i][1] = max(dp[i-1][1], dp[i-1][2] + nums.get(i-1));
                dp[i][2] = max(dp[i-1][2], dp[i-1][0] + nums.get(i-1));
            }
        }
        

        return dp[n][0];
    }


}

思路

使用动态规划解决
状态转移方程:
dp[i][j] = max(dp[i-1][j], dp[i-1][3-j] + nums.get(i-1)); ( * 根据情况而定)
比如 t%3 == 2
对于dp[i][0],有前两种状态可以递推得到:
dp[i-1][1] + t
dp[i-1][0]
从这两种状态中取最大值,就是前 i 个数中%3==0的最大和。
我们也需要保证dp[i-1][1]是最大的,因此我们要写3个dp,并且要分类讨论。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python数字游戏算法训练是一种通过编写代码来解决数字游戏问题的训练方法。这些问题通常涉及数字的操作、计算和逻辑推理。下面是一些常见的数字游戏算法训练题目和解决方法: 1. 猜数字游戏:在这个游戏中,程序会随机生成一个数字,然后玩家需要猜测这个数字是多少。程序会根据玩家的猜测给出提示,直到玩家猜对为止。解决这个问题的方法是使用循环和条件判断来不断与玩家交互,直到猜对为止。 2. 数字拼图游戏:在这个游戏中,给定一个乱序的数字序列,目标是通过交换数字的位置,将其按照从小到大的顺序排列。解决这个问题的方法可以使用排序算法,如冒泡排序、插入排序或快速排序等。 3. 数独游戏:数独是一种经典的数字逻辑游戏,目标是在一个9x9的网格中填入数字1-9,使得每一行、每一列和每一个3x3的子网格中的数字都不重复。解决这个问题的方法可以使用回溯算法来逐步填充网格,并通过递归和回溯来找到解决方案。 4. 斐波那契数列:斐波那契数列是一个经典的数学问题,其中每个数字都是前两个数字之和。解决这个问题的方法可以使用递归或循环来计算斐波那契数列的前n个数字。 5. 素数判断:素数是只能被1和自身整除的正整数。解决这个问题的方法可以使用循环和条件判断来判断一个给定的数字是否为素数。 以上只是一些常见的数字游戏算法训练题目和解决方法,实际上还有很多其他类型的数字游戏可以用来进行算法训练。希望这些信息对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值