原题链接:蓝桥杯2019年第十届国赛真题-最优包含
解题思路:
动态规划。
①创建一个大小为(n+1)*(m+1)的二维数组,命名为dp,n和m分别为字符串s、t的长度。
其中dp[i][j]表示s中的前i个字符要想包含t的前j个字符最少需要修改几次。
②dp[i][0] = 0(i = 0 to n)
③状态转移方程
当s[i] = t[j]时,这时我们不用进行变换则,dp[i][j] = dp[i-1][j-1]
当s[i] != t[j]时,这时有两种情况,一种情况是,在s中没取到第i个字符时,已经可以包含t取到字符j了。
另一种情况是,此时t取到第j个字符时还未被包含,那么在此时,就要进行一次变换
所以dp[i][j] = min(dp[i-1][j],dp[i-1][j-1]+1)
注意事项:
参考代码:
from cmath import inf s = input().strip() t = input().strip() n = len(s) m = len(t) dp = [[inf for j in range(m+1)] for i in range(n+1)] for i in range(n+1): dp[i][0] = 0 for i in range(1,n+1): for j in range(1,m+1): if s[i-1] == t[j-1]: dp[i][j] = dp[i-1][j-1] else: dp[i][j] = min(dp[i-1][j],dp[i-1][j-1]+1) print(dp[n][m])
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复