竞赛总览
CSDN 编程竞赛五十五期:比赛详情 (csdn.net)
吐槽:填空题参考答案错误,赛后竟然没有修正……
竞赛题解
题目1、取石子
将n堆石子摆成一排。游戏规则:两人轮流从最左或最右的一堆中取出若干颗石子(可以将一堆整个取掉,但不能不取),无法再取者判负。 对于给定的初始石子局面,是否存在先手必胜策略?
这是一道动态规划题目,不过鉴于测试数据比较简单,只有两种情况,博主选择直接骗分通过。
题目2、勾股定理(困难版)
给定斜边z的值,求所有直角边x和y的组合数(x、y、z都是正整数)。
博主选择直接暴力,过了40%的测试点(数据还是比较弱的)。
实际上,这道题求x ^ 2 + y ^ 2 = z ^ 2,并且给定z,可以转化为如下形式:
给定圆的坐标(正整数z),求圆上坐标为整数的点有多少个(不包括坐标轴上固定的4个整数点)。
这里只是抛砖引玉,感兴趣的小伙伴自行搜索吧,圆((0,0),r)会经过几个整数坐标点?
题目3、填空
从1开始,每次增加1、2或3,有()种方法可以加到9。
这是一道典型的递归题目,原型为 Adding 1s, 2s, and 3s,相信很多递归初学者都见过这道题目。
本质上,递归问题是动态规划问题的基础。遇到递归问题,从简单情况出发,由简单情况推到复杂情况,即可得到状态转移方程。
1 = 1(只有一种,从1开始,不加)
2 = 1(只有一种,从1开始,1+1;题目没说可以直接加2,而是要从1开始加,所以这里只有一种;否则,如果从0开始加1、2或3,这里就是两种情况了,即0+1+1、0+2)
3 = 2(有两种情况:1+1+1、1+2;分别可以视为:2的基础上加1、1的基础上加2)
4 = 4(有四种情况:1+1+1+1、1+2+1、1+1+2、1+3;分别可以视为:3的基础上加1、2的基础上加2、1的基础上加3)
5 = 7(4的基础上加1、3的基础上加2、2的基础上加3)
6 = 13(5的基础上加1、4的基础上加2、3的基础上加3)
7 = 4 + 7 + 13 = 24
8 = 7 + 13 + 24 = 44
得到递推式:f (n) = f (n - 1) + f (n - 2) + f (n - 3)。