Java 大学C组 第十届蓝桥杯 2019年国赛真题( 四 )


#F 最长子序列
时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
问题描述
我们称一个字符串 S 包含字符串 T 是指 T 是 S 的一个子序列,即可以从字符串 S 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 T 完全一样 。
给定两个字符串 S 和 T,请问 T 中从第一个字符开始最长连续多少个字符被 S 包含?
输入格式
输入两行,每行一个字符串 。第一行的字符串为 S,第二行的字符串为 T 。
两个字符串均非空而且只包含大写英文字母 。
输出格式
输出一个整数,表示答案 。
测试样例1
Input:ABCDEABCDAABZOutput:3
评测用例规模与约定
对于 20% 的评测用例,1 ≤ |T| ≤ |S | ≤ 20;
对于 40% 的评测用例,1 ≤ |T| ≤ |S | ≤ 100;
对于所有评测用例,1 ≤ |T| ≤ |S | ≤ 1000 。
code:
import java.io.IOException;import java.io.BufferedReader;import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));String S = in.readLine();String T = in.readLine();int j = 0;for (int i = 0, ih = S.length(), jh = T.length(); i < ih && j < jh; i++)if (S.charAt(i) == T.charAt(j)) j++;System.out.println(j);}}
经典第一题友好
#G 数正方形
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
问题描述
在一个 N × N 的点阵上,取其中 4 个点恰好组成一个正方形的 4 个顶点,一共有多少种不同的取法?
由于结果可能非常大,你只需要输出模 109 + 7 的余数 。
如上图所示的正方形都是合法的 。
输入格式
输入包含一个整数 N 。
输出格式
输出一个整数代表答案 。
测试样例1
Input:4Output:20
评测用例规模与约定
对于所有评测用例,2 ≤ N ≤。
规律显然易见
code:
import java.io.IOException;import java.io.InputStream;public class Main {static final int mod = 1000000007;public static void main(String[] args) throws IOException {long n = nextInt(System.in);long res = ((n - 1)* (n - 1)) % mod;for (int i = 2; i < n; i++)res = (res + (((n - i) * (n - i)) % mod) * i) % mod;System.out.println(res);}static int nextInt(InputStream in) throws IOException {int n = 0, c = in.read();while (c < '0' || c > '9') c = in.read();while (c >='0' && c <='9') {n = n * 10 + (c & 0xf);c = in.read();}return n;}}
#H 矩阵计数
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
问题描述
一个 N × M 的方格矩阵,每一个方格中包含一个字符 O 或者字符 X 。
要求矩阵中不存在连续一行 3 个 X 或者连续一列 3 个 X 。
问这样的矩阵一共有多少种?

Java 大学C组  第十届蓝桥杯 2019年国赛真题

文章插图
输入格式
输入一行包含两个整数 N 和 M 。
输出格式
输出一个整数代表答案 。
测试样例1
Input:2 3Output:49
评测用例规模与约定
对于所有评测用例,1 ≤ N, M ≤ 5 。
code:
import java.io.IOException;import java.io.InputStream;public class Main {static boolean[] map;static int n, m, end, cnt;public static void main(String[] args) throws IOException {n = nextInt(System.in);m = nextInt(System.in);end = n * m;map = new boolean[end];dfs(0);System.out.println(cnt);}static void dfs(int depth) {if (depth == end)cnt++;else {dfs(depth + 1);if (check(depth)) return;map[depth] = true;dfs(depth + 1);map[depth] = false;}}static boolean check(int index) {int i = index / n, offset = i * n, j = index - offset, cnt = 1;for (int k = j - 1; k >= 0; k--) {if (map[offset + k]) cnt++;else break;}if (cnt >= 3) return true;cnt = 1;while (i-- > 0) {if (map[i * n + j]) cnt++;else break;}if (cnt >= 3) return true;return false;}static int nextInt(InputStream in) throws IOException {int n = 0, c = in.read();while (c