oPPo笔试第三题
放一下第三题我的解题思路:
题目是将字符串s变为包含至少k个"oppo"子串所需要的最小操作次数(只能字符替换)(oppoppo包含2个oppo)
这题我用动态规划做的,定义一个三维数组dp[n][k+1][2],其中最后一个维为0表示不以o结尾,1表示以0结尾
那么递推公式为
当前位置上为o:
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1])+1
dp[i][j][1]=min(dp[i][j][0]-1,dp[i-3][j-1][0]+{把前三位位转为”OPP“的代价},dp[i-1][j][1],dp[i-3][j-1][1]+{把中间两位转为”PP“的代价})
当前位置上不为o:
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1])
dp[i][j][1]=min(dp[i][j][0],dp[i-3][j-1][0]+{中间两位转为”PP“的代价}+1,dp[i-3][j-1][1]+{把中间两位转为”PP“的代价})+1
感觉想得有点复杂,有没有大佬有更好的方法,分享一下
题目是将字符串s变为包含至少k个"oppo"子串所需要的最小操作次数(只能字符替换)(oppoppo包含2个oppo)
这题我用动态规划做的,定义一个三维数组dp[n][k+1][2],其中最后一个维为0表示不以o结尾,1表示以0结尾
那么递推公式为
当前位置上为o:
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1])+1
dp[i][j][1]=min(dp[i][j][0]-1,dp[i-3][j-1][0]+{把前三位位转为”OPP“的代价},dp[i-1][j][1],dp[i-3][j-1][1]+{把中间两位转为”PP“的代价})
当前位置上不为o:
dp[i][j][0]=min(dp[i-1][j][0],dp[i-1][j][1])
dp[i][j][1]=min(dp[i][j][0],dp[i-3][j-1][0]+{中间两位转为”PP“的代价}+1,dp[i-3][j-1][1]+{把中间两位转为”PP“的代价})+1
感觉想得有点复杂,有没有大佬有更好的方法,分享一下
全部评论
是这样做的,我也是
相关推荐
10-11 16:54
河北工程技术学院 测试工程师 点赞 评论 收藏
分享
10-19 15:00
文华学院 嵌入式工程师 点赞 评论 收藏
分享
11-21 13:08
蚌埠坦克学院 C++ 点赞 评论 收藏
分享