leetcode 第 207 场算法比赛

作者: | 更新日期:

暴力与动态规划才是王道

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

昨天周六,下午参加了 leetcode 的年度团队赛。
今天周日,上午参加了 Leetcode 的第 207 场周赛,下午参加了 ICPC 的网络赛。
晚上的第三次计蒜客算法比赛就不参加了,做不动了。

回头看看上午这场周赛,其实题目都比较基础。
下面来看看这四道题吧。

一、重新排列单词间的空格

题意:给一个内有空格的字符串,空格将字符串分割为若干个子字符串。
请调整空格的位置,使得这些子字符串之间的空格相等且尽量多,剩余的空格放在字符串最后。

题意:按空格分隔字符串,并统计空格的个数,计算出字符串之间的空格数量,剩余的追加到最后面。

二、拆分子字符串数目最多

题意:将一个字符串拆分为若干不同的子字符串,求最多可以拆分多少个。

思路:第一眼看到这道题会不会做,因为暴力搜索的话复杂度太高。
再看看数据范围,字符串长度最长为 16, 暴搜即可。

三、矩阵的最大非负积

题意:给一个矩阵,从左上角到右下角找一条路线,使得乘积最大。如果最大乘积为负数,输出 -1

思路:典型的动态规划题。
由于存在负数,每个位置需要计算一个最大正值和最小负值。这样最小负值可以负负得正得到最大正直。

四、连通两组点的最小成本

题意:给两个集合 A 和 B,以及两个集合间任意两点连线的代价。
问 A 集合的任意一点都与 B 集合有至少一条连线,B 集合的任意一点都与 A 集合有至少一条连线的最小代价。

思路:与第二题类似,一看只能暴力搜索,带会超时。
再看下数据范围,集合的点只有 12 个。
因此可以使用状态压缩,一个数字就可以代表当前集合选了哪些点。

状态定义 f(n, flag) 为A集合里前 n 个点与 B 集合 flag 点连线的最低代价。
flag 定义:位压缩形式,第 i 位值为 1 代表连线,0 代表没连线。

状态转移:枚举前 n-1 个点的 flag1,剩下的 flag2 就是第 n 个点要连的。
如果 flag2 为 0,那么第 n 个点只需要在 flag 里面找一个代价最小的点连线即可。

五、最后

这次比赛都是基础题,第二题就是枚举搜索,后两题都是动态规划。

没其他的补充了。

思考题:这些题你都是怎么做的呢?

《完》

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越