今日学习📃
🥇数字三角形(一题两解) | ✨数字三角形 |
🥈等差数列(一题两坑) | ✨等差数列 |
🥉包子凑数(dp压缩+打表) | ✨包子凑数 |
🥇数字三角形
package Day_Day_work;
import java.util.Scanner;
/**
* @author yx
* @date 2022-03-20 11:42
*/
public class dp打表法 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();//山的高度
int [][]arr=new int[n][n];
for (int i = 0; i <n ; i++) {
for (int j = 0; j <=i ; j++) {
arr[i][j]=scanner.nextInt();
}
}
int dp[][]=new int[n][n];
dp[n-1]=arr[n-1];//初始化dp数组的最后一行
for (int i = n-2; i >=0 ; i--) {
for (int j = 0; j <=i ; j++) {
dp[i][j]=arr[i][j]+Math.max(dp[i+1][j],dp[i+1][j+1]);//dp数组中的每一个位置都是当前更新的最大值
}
}
System.out.println(dp[0][0]);
}
}
package Day_Day_work;
import java.util.Scanner;
/**
* @author yx
* @date 2022-03-20 12:47
*/
public class 滚动数组解法 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
int [][]arr=new int[n][n];//存的是输入进来的数组
int []dp=new int[n];//存的是当前最优的值
for (int i = 0; i <n ; i++) {
for (int j = 0; j <=i ; j++) {
arr[i][j]=scanner.nextInt();
}
}
dp=arr[n-1];
for (int i = n-2; i >=0 ; i++) {
for (int j = 0; j <=i ; j++) {
dp[j]=arr[i][j]+Math.max(dp[j],dp[j+1]);//更新当前的最优值并覆盖原来的值
}
}
System.out.println(dp[0]);
}
}
🥈等差数列
package Day_Day_work;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author yx
* @date 2022-03-12 19:22
*/
/*
需要考虑的情况
1、公差为0
2、公差为>=1
*/
public class 等差数列__gcd模板 {
static int min;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
int[]A=new int[n];
int[]B=new int[n-1];
for(int i=0;i<n;i++){
A[i]=scanner.nextInt();
}
Arrays.sort(A);
for (int i = 0; i < n-1; i++) {
B[i]=A[i+1]-A[i];//求差值
}
min=gcd(B[0],B[1]);
for (int i = 1; i < n-2; i++) {//求公差的最大公约数
if (gcd(B[i], B[i + 1]) < min) {
min = gcd(B[i], B[i + 1]);//如果公差为0,则直接返回0
}
}
if(min==0){//公差为0的情况要放在for循环外面考虑
System.out.println(n);
return;
}
System.out.println((A[n-1]-A[0])/min+1);
}
static int gcd(int m,int n){//求最大公约数的模板
return n!=0 ? gcd(n,m%n): m;
}
}
🥉包子凑数
package Day_Day_work;
import java.util.Scanner;
/**
* @author yx
* @date 2022-03-18 23:52
*/
//类似于”买不到的数目“
public class 包子凑数__dp打表法 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
boolean arr[]=new boolean[10200];//根据裴蜀定理得最大不能表示的数字位(ab-a-b)
int shuru[]=new int[n];
int g=0;
int answer=0;
arr[0]=true;
for (int i = 0; i < n; i++) {
shuru[i]=scanner.nextInt();
if (i==0)g=shuru[0];
else {
g=gcd(g,shuru[i]);
}
for (int j = 0; j < 10000; j++) {//打表法
if(arr[j]){
/*
因为0<=j<10000,0<shuru[i]<=100,所以这个地方解释了为什么arr[10200],防止溢出
状态压缩成一维数组
*/
arr[j+shuru[i]]=true;
}
}
}
if(g!=1){
System.out.println("INF");
return;
}
for (int i = 0; i < 10000; i++) {
if(!arr[i])answer++;
}
System.out.println(answer);
}
static int gcd(int m,int n){
return n!=0?gcd(n,m%n):m;
}
}
🚀写在最后
博主给大家分享一个神奇的网站,上面有许多我们在算法竞赛中需要用到的数论知识💖oi-wikii
距离蓝桥杯正式省赛的时间越来越近了,你是否还在认真的备赛呢?
最后,希望我们都能够相信这么一句话:“只要路是对的,就不害怕遥远”
欢迎各位来交流讨论!