真题解析│2017年蓝桥杯软件类省赛传统“送分题”

2017年蓝桥杯软件类省赛C++大学A组第5题“字母组串”。一道代码填空题,据说这是传统的送分题,一起来看看是怎么送分的。

01

题目描述

由 A,B,C 这3个字母就可以组成许多串。比如:“A”,“AB”,“ABC”,“ABA”,“AACBB” …

现在,小明正在思考一个问题:如果每个字母的个数有限定,能组成多少个已知长度的串呢?

他请好朋友来帮忙,很快得到了代码,解决方案超级简单,然而最重要的部分却语焉不详。

请仔细分析源码,填写划线部分缺少的内容。

# include<stdio.h>

// a个A,b个B,c个C 字母,能组成多少个不同的长度为n的串。

intf( inta, intb, intc, intn)

{

if(a< 0|| b< 0|| c< 0) return0;

if(n== 0) return1;

return______________________________________ ; // 填空

}

intmain

{

printf( “%dn”, f( 1, 1, 1, 2));

printf( “%dn”, f( 1, 2, 3, 3));

return0;

}

对于上面的测试数据,小明口算的结果应该是:

6

19

注意:只填写划线部分缺少的代码,不要提交任何多余内容或说明性文字。

02

DP填空

1.C++代码

一个排列组合问题,题目要求用递归实现。答案如下:

returnf(a – 1, b, c, n – 1) + f(a, b – 1, c, n – 1) + f(a, b, c – 1, n – 1);;

2.Java代码

2017蓝桥杯Java类的第5题也是“字母组串”,这里附上答案。

publicclass_05字母组串 {

// a个A,b个B,c个C 字母,能组成多少个不同的长度为n的串。

staticintf( inta, intb, intc, intn) {

if(a < 0|| b < 0|| c < 0) return0;

if(n == 0) return1;

returnf(a – 1, b, c, n – 1) + f(a, b – 1, c, n – 1) + f(a, b, c – 1, n – 1); //填空

}

publicstaticvoidmain(String[] args){

System.out.println(f( 1, 1, 1, 2));

System.out.println(f( 1, 2, 3, 3));

}

}

03

母函数

对于排列组合问题,经典的解法是母函数。用母函数处理组合问题,较为直接。

参考本篇参考书籍 《算法竞赛入门到进阶》173页“指数型母函数”,书上的例题 hdu 1521 和这题“字母组串”几乎一样。

下面图片为所涉及到的书中内容贴图:

04

参考书籍

算法竞赛入门到进阶

ISBN:978-7-302-52915-6

罗勇军 郭卫斌 编著

定价:59.80元

05

精彩文章回顾

  • 从火种到能源,华为做AI的逻辑链

  • 华为 AI,建造中的全景图

  • 逻辑回归的MATLAB实践|附代码

  • Python爬虫实例:采集微博博文|附视频

  • MySQL利用E-R模型的数据库概念设计|附视频

  • HTML5 实现黑白棋游戏 附代码
  • 利用微信小程序实现活动 名登记 | 附代码
  • 使用Flutter小部件跨平台开发移动端App组件 | 附代码
  • 电脑病毒木马的清除和防范方法 | 附视频
  • 教你用Python做在线人脸 检测
  • 一篇文章读懂:Spark运行模式
  • 有监督机器学习——K近邻算法解决二分类问题|附代 码
  • 无监督机器学习——K均值算法解决病毒聚类问题|附代 码
  • 无监督机器学习——K均值算法实现简单聚类|附代码
  • 实战Spring Boot | 天气预 系统的开发
  • 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2021年1月13日
    下一篇 2021年1月14日

    相关推荐