小易的升级之路
算法原理
数学 + 模拟,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);
}
}
礼物的最大价值
算法原理
动态规划,基本路径问题模板
- dp[i][j]表示在此处获得的礼物最大值
- 动态转移方程: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");
}
}
}