蓝桥杯第十一届国赛JavaB组部分题解

前言

本分的题解都是博主在经过跟伙伴一定的讨论,初步认为无误的,博主是JavaB国二。所以也是菜鸡一个,大家互相学习罢了。如果有错误或者感觉有疑问。欢迎评论区"开战"。

题目文件

题目文件我用百度网盘分享给大家 连接链接:https://pan.baidu.com/s/1pZk9GZ7Mc-zxmv7z373W7w
提取码:ovj8

目录

试题A:美丽的2

试题D:本质上的升序列

美丽的2

问题描述

小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴。
他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少个年份的数位中
包含数字 2?(填空题)

分析

暴力循环1~2020。int转换为string判断每个string是否存在2,做计数即可。这道题就是一个送分题,很简单。

public class Main {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i <=2020 ; i++) {
            String s = String.valueOf(i);
            for (int j = 0; j < s.length(); j++) {
                if (s.charAt(j) == '2') {
                    count++;
                    break;
                }
            }
        }
        System.out.println(count);
    }
}

本质上升序列

题目描述

小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺
序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串 lanqiao 中,如果取出字符 n 和 q,则 nq 组成一个单
调递增子序列。类似的单调递增子序列还有 lnq、 i、 ano 等等。
小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第
二个字符和最后一个字符可以取到 ao,取最后两个字符也可以取到 ao。小蓝
认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个?
例如,对于字符串 lanqiao,本质不同的递增子序列有 21 个。它们分别
是 l、 a、 n、 q、 i、 o、 ln、 an、 lq、 aq、 nq、 ai、 lo、 ao、 no、 io、 lnq、
anq、 lno、 ano、 aio。
请问对于以下字符串(共 200 个小写英文字母,分四行显示):(如果你把
以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在
试题目录下有一个文件 inc.txt,内容与下面的文本相同)
tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl
本质不同的递增子序列有多少个?

分析

这道题正合我的胃口,最近正在刷动态循环(laduladong的算法小抄)动态规划最重要的就是先确定dp数组的定义,构建base case(动态规划初始的部分),最后状态转移返程。
dp[i]表示以num[i](num为String转换成char的数组)结尾的上升序列数量。
状态转移方程得排dp[i]=dp[0…i](中结尾比num[i]小的dp),如果相等的话,需要相减去重。
最后需要的结果就是全部dp的和。上代码

public class Main {
    public static int[] dp;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        char[] num = s.toCharArray();
        dp = new int[s.length()];
        //num[i]本身是一个升序列,初始化1
        Arrays.fill(dp, 1);
        for (int i = 0; i < s.length(); i++) {
            for (int j = 0; j < i; j++) {
                if (num[j] < num[i]) {
                    dp[i] += dp[j];
                }
                if (num[j] == num[i]) {
                    dp[i] -= dp[j];
                }
            }
        }
        int res=0;
        for (int i = 0; i < dp.length; i++) {
            res+=dp[i];
        }
        System.out.println(res);
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值