投递字节跳动等公司10个岗位 >
0 点赞 评论 收藏
分享
haozheyan97:第一题分两种情况。
首先如果 b > m需要调整到b = m.
1. n < b. 显然答案为0.
2. n >= b. 显然我们总伤害数为n * b. 理论上最大能够打min(m, n * b // a)个木头人。
下面证明确实可以做的到打那么多个。
假设我们理论最大值为k个, 每个为a血, 则我们可以把它排成一个k * a的矩阵,每个元素都为1. 现在我们每一次可以划去不同行中的至多b个1. 那么显然我们可以按照每一列从左往右划去1. 因此一定最终能划完。
而每一行剩余的1的数量代表木头人的血量, 当这个矩阵内所有的1都被划去的时候,就意味着我们可以做到打掉k个木头人。
第二题dp。
设f(i, j)为从[i, j]开始走能得到的最大和值,则可以得出以下转移方程。
f(i, j) = A[i][j] + max{f(i ± k, j ± k) | A[i ± k][j ± k] > A[i][j]}
然后记忆化搜索就可以过了。
投递阿里巴巴等公司10个岗位 >
0 点赞 评论 收藏
分享
投递商汤科技等公司10个岗位 >
0 点赞 评论 收藏
分享
关注他的用户也关注了: