【CSDN竞赛】第八期解题报告

18 篇文章 0 订阅
17 篇文章 0 订阅

这应该是站内相对详细的解题报告吧。
转载思路请@本人。

感想

关于自己

这一次又考差了(指第二)
由于第一题调了半天没调出来,所以没拿满分,只有 90 90 90
总的来说,时间安排不合理
期待下次各位dalao能手下留情留我一个第一

关于平台

这次的题目质量说不清楚(拉掉了许多人)
有些地方描述不清楚/错误,如第二题数据范围应该是 n ≤ 1 0 3 n\leq 10^3 n103
第一题是真的奇怪,本人用了 J a v a Java Java C C C C + + C++ C++全部过不去,唯独 C + + C++ C++拿了 90 90 90
有时候的自测调试会把警告也提示错误,导致本来可以运行的程序只能在保存运行处提交
并且有些本来时间复杂度很低的程序莫名其妙运行无结果,也没有提示时间超限,非常疑惑
此外,由于本人的考试报告空白,所以无法提供当时的考试代码
总而言之,系统有提升,但不多;题目有改进,但也不多。

第一题 (难度:入门但是不完全入门)

题目描述

给你两个字符串 S S S T T T,让你从 S S S中剪下字符组成 T T T,问是否可行。

90分做法

发现数据范围很小,就直接暴力匹配。
对于每一个 T T T串中的字母,我们都在 S S S中找其对应的字母,然后删除。
注意只考虑有效字符。
如果找不到,就输出 N o No No。否则输出 Y e s Yes Yes

100分做法

我也不知道,也许是什么奇怪的判断之类的。
听说不能要空格

第二题 (难度:中等)

题目描述

给定一个只包含大小写字母的字符串 S S S,你现在可以往字符串的任意一个位置插入字符,并且可以插入若干次,问最少插入多少次可以使得 S S S变为回文串。

100分做法

因为回文串是从两端到中间都相同,所以我们考虑从两端开始匹配。
d p i , j dp_{i,j} dpi,j表示 [ i , j ] [i,j] [i,j]没有匹配的最小插入字符数。
转移:
S i − 1 = S j + 1 S_{i-1}=S_{j+1} Si1=Sj+1时,可以直接匹配:
d p i , j = m i n ( d p i , j , d p i − 1 , j + 1 ) dp_{i,j}=min(dp_{i,j},dp_{i-1,j+1}) dpi,j=min(dpi,j,dpi1,j+1)
对于任意情况,都可以添加字符来匹配任意一端:
d p i , j = m i n ( d p i , j , m i n ( d p i − 1 , j , d p i , j + 1 ) + 1 ) dp_{i,j}=min(dp_{i,j},min(dp_{i-1,j},dp_{i,j+1})+1) dpi,j=min(dpi,j,min(dpi1,j,dpi,j+1)+1)
最后答案就在所有 d p i , i dp_{i,i} dpi,i d p i , i − 1 dp_{i,i-1} dpi,i1里面,枚举所有 i i i求最小值即可。
注意初始化 d p i , j = i n f , d p 1 , n = 0 dp_{i,j}=inf,dp_{1,n}=0 dpi,j=inf,dp1,n=0

第三题 (难度:简单~中等)

题目描述

给你一个矩阵,从左上角开始走,每次只能向下走一步或向右走一步,求走过路径的和的最小值。

100分做法

动态规划入门题,或者说是递推。
d p i , j dp_{i,j} dpi,j表示到达点 ( i , j ) (i,j) (i,j)的最小和。则:
d p i , j = m i n ( d p i − 1 , j , d p i , j − 1 ) + a i , j dp_{i,j}=min(dp_{i-1,j},dp_{i,j-1})+a_{i,j} dpi,j=min(dpi1,j,dpi,j1)+ai,j
最后输出 d p n , n dp_{n,n} dpn,n即可。

第四题(难度:中等+)

题目描述

A A A B B B轮流从袋子里取糖果,糖果分为甜的和普通的。
A A A每次取一颗, B B B每次取一颗顺带扔掉一颗。
如果上述取/扔的操作概率均匀随机,求 A A A先取到甜糖果的概率。

100分做法

一道概率动态规划题,也可以记忆化搜索。
我们设 d p i , j , 0 / 1 dp_{i,j,0/1} dpi,j,0/1表示甜糖果剩下 i i i个,普通糖果剩下 j j j个,当前是 A A A/ B B B先手,当前状态的概率。
A A A先手时:

  1. 如果他摸到了甜糖果,游戏结束,累加答案:
    a n s + = d p i , j , 0 × i i + j ans+=dp_{i,j,0}× \frac{i}{i+j} ans+=dpi,j,0×i+ji
  2. 如果他摸到了普通糖果,游戏继续:
    d p i , j − 1 , 1 + = d p i , j , 0 × j i + j dp_{i,j-1,1}+=dp_{i,j,0}× \frac{j}{i+j} dpi,j1,1+=dpi,j,0×i+jj

B B B先手时:

  • 如果他摸到了甜糖果,游戏结束,无转移;
  • 如果他摸到了普通糖果,扔掉了甜糖果:
    d p i − 1 , j − 1 , 0 + = d p i , j , 1 × j i + j × i i + j − 1 dp_{i-1,j-1,0}+=dp_{i,j,1}× \frac{j}{i+j}× \frac{i}{i+j-1} dpi1,j1,0+=dpi,j,1×i+jj×i+j1i
  • 如果他摸到了普通糖果,扔掉了普通糖果:
    d p i , j − 2 , 0 + = d p i , j , 1 × j i + j × j − 1 i + j − 1 dp_{i,j-2,0}+=dp_{i,j,1}× \frac{j}{i+j}× \frac{j-1}{i+j-1} dpi,j2,0+=dpi,j,1×i+jj×i+j1j1

至此,转移结束。
最后答案就是 a n s ans ans
记得初始化 d p n , m = 1 dp_{n,m}=1 dpn,m=1

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值