😜今日份搞题 😜
🥇1.求先序排列
🥈2.摆动序列
🥉3.瓷砖铺放
🥇求先序排列
⚽题目描述
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
⌨输入格式
两行,每行一个字符串,分别表示中序和后序排列
🔍输出格式
一个字符串,表示所求先序排列
样例输入 BADC BDCA 样例输出 ABCD
import java.util.*;
public class Main
{
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
String mid=sc.next();//中序
String after=sc.next();//后序
before(mid,after);
}
private static void before(String mid, String after) {
if (mid.length()>0) { //若右树有值
char c=after.charAt(after.length()-1);//最后一个字符
System.out.print(c);
int n=mid.indexOf(c);//找到主根
before(mid.substring(0,n), after.substring(0,n));//一次循环
before(mid.substring(n+1), after.substring(n,after.length()-1));
}
}
}
解题思路
1️⃣.中序ACGDBHZKX,后序CDGAHXKZB,首先可找到主根B;
2️⃣.那么我们找到中序遍历中的B,由这种遍历的性质,可将中序遍历分为ACGD和HZKX两棵子树
3️⃣.那么对应可找到后序遍历CDGA和HXKZ(从头找即可)
4️⃣.从而问题就变成求
(1).中序遍历ACGD,后序遍历CDGA的树
(2).中序遍历HZKX,后序遍历HXKZ的树
🥈摆动序列
⚽题目描述
资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 如果一个序列满足下面的性质,我们就将它称为摆动序列: 1. 序列中的所有数都是不大于k的正整数; 2. 序列中至少有两个数。 3. 序列中的数两两不相等; 4. 如果第i – 1个数比第i – 2个数大,则第i个数比第i – 2个数小;如果第i – 1个数比第i – 2个数小,则第i个数比第i – 2个数大。 比如,当k = 3时,有下面几个这样的序列: 1 2 1 3 2 1 2 1 3 2 3 2 3 1 3 1 3 2 一共有8种,给定k,请求出满足上面要求的序列的个数。
⌨输入格式
输入包含了一个整数k。(k<=20)
🔍输出格式
输出一个整数,表示满足要求的序列个数。
样例输入 3 样例输出 8
import java.util.*;
public class Main
{
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[][] dp=new int[n+1][n+1];
for (int i = 2; i <=n; i++) {
dp[i][2]=i*(i-1);
}
for (int i = 2; i <=n; i++) {
for (int j =3; j <=n; j++) {
dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
}
}
int sum=0;
for (int i = 2; i <=n; i++) {
sum+=dp[n][i];
}
System.out.println(sum);
}
}
解题思路
1️⃣.子问题确定:最长上升子序列告诉我们
元素最大值
在子问题的使用表达中不可忽视,本题目就是以满足条件序列最大值
以及序列长度
作为子问题进行解决的;2️⃣.状态:状态数组
dp[i][j]
表示的含义为:i为所满足条件的序列中的最大值
,j为序列长度
(i 可以不包含在序列中,如i为4、j为3时,231、241均满足条件);3️⃣.初始状态:当
序列长度为2
时,即dp[i][2]时,没有所谓的中位数,只有大、小两个数,题目就转换为求排列组合的问题了,即:在i个数中选取2个数进行排列;4️⃣.状态转移方程:
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
🥉瓷砖铺放
⚽题目描述
资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限。要将这个长度为N的地板铺满,一共有多少种不同的铺法? 例如,长度为4的地面一共有如下5种铺法: 4=1+1+1+1 4=2+1+1 4=1+2+1 4=1+1+2 4=2+2 编程用递归的方法求解上述问题。
⌨输入格式
只有一个数N,代表地板的长度
🔍输出格式
输出一个数,代表所有不同的瓷砖铺放方法的总数
样例输入 4 样例输出 5
import java.util.*;
public class Main
{
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(f(n));
}
private static int f(int n) {
if (n==1) {
return 1;
}
if (n==2) {
return 2;
}
else {
return f(n-1)+f(n-2);
}
}
}
解题思路
1️⃣.使用递归方法
2️⃣.递归中,第一块瓷砖要么取长度1的,要么取长度2的
3️⃣.第二块瓷砖要么取长度1的,要么取长度2的,以此类推最后再用公式推算即可。
💌最后总结
距离省赛的时间越来越近了,小伙伴们要加油哇,一起冲向国赛。
简单的题都会,难的题下点功夫:“只要功夫深,铁杵磨成绣花针!”