48Days-Day09 | 小易的升级之路,礼物的最大价值,对称之美

小易的升级之路

小易的升级之路_牛客题霸_牛客网

算法原理

数学 + 模拟,gcd模板,用欧几里得算法递归,递归结束条件是当b == 0时,return a;

注意点

要开Long

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt(), x = scan.nextInt();
            for (int i = 0; i < n; i++) {
                int a = scan.nextInt();
                if (a > x) x += gcd(a, x);
                else x += a;
            }
            System.out.println(x);
        }
    }

    public static int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b, a % b);
    }
}

礼物的最大价值

礼物的最大价值_牛客题霸_牛客网

算法原理

动态规划,基本路径问题模板

  1. dp[i][j]表示在此处获得的礼物最大值
  2. 动态转移方程:dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]) + grid[i-1][j-1]; 此处只能从上或左过来,所以找其中俩的最大值再加上此处的礼物值

代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型二维数组 
     * @return int整型
     */
    public int maxValue (int[][] grid) {
        // write code here
        int m = grid.length, n = grid[0].length;
        int[][] dp = new int[m+1][n+1];

        for(int i = 1; i <= m; i++)
            for(int j = 1; j <= n; j++) {
                dp[i][j]+= Math.max(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1];
            }
        return dp[m][n];
    }
}

对称之美

对称之美

算法原理

双指针 + 哈希,事实上就是回文字符串模板的拓展版,只是这次左右指针指向的是一整个字符串,左右指针一头一尾,先统计左指针所指字符串里面有些什么字符,再判断右指针里面有没有相同的字符,有就说明可以继续判断下一个,left++, right--; 一直到最后都有相同的,那么就要么left == right,要么left > right,即两指针错开,否则就说明中途跳出了循环,那就是有不相同的地方,就不能构成回文

代码

import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int group = scan.nextInt();
        for (int i = 0; i < group; i++) {
            int n = scan.nextInt();
            String[] strs = new String[n];
            for (int j = 0; j < n; j++)
                strs[j] = scan.next();

            int left = 0, right = n - 1;
            while (left <= right) {
                HashSet<Character> set = new HashSet<>();
                boolean flg = false;
                for (int k = 0; k < strs[left].length(); k++)
                    set.add(strs[left].charAt(k));

                for (int k = 0; k < strs[right].length(); k++)
                    if (set.contains(strs[right].charAt(k))) {
                        flg = true;
                        break;
                    }
                if (flg) {
                    left++;
                    right--;
                } else break;
            }
            if (left < right) System.out.println("No");
            else System.out.println("Yes");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TinaAmber

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值