矩阵中要删除的最小列,以便按字典顺序对行进行排序

时间:2019-03-24 15:29:50

标签: algorithm dynamic-programming

我正在尝试解决此招聘竞赛问题(现已关闭)

  

词典行

     

您将获得一个字符矩阵。在一项操作中,您可以删除   矩阵的一列。您可以执行任意数量的操作   想。您的任务是使最终矩阵有趣,即   行的字符组成的字符串在字典上较小   或等于由行字符组成的字符串。你需要   使用尽可能少的操作数。空矩阵是   总是一个有趣的矩阵。

     

输入

     

第一行包含两个整数和。接下来的行包含   每个字母。

     

输出

     

在输出中,您需要打印最少数量的操作   使矩阵有趣。

     

约束

     

输入中只有小写英文字母作为字符。

     

样本输入

     

3 3

     

cfg

     

agk

     

dlm

     

示例输出

     

1

     

说明

     

删除第一列以使矩阵有趣。

我非常确信这是DP问题。我在寻找最佳子问题时遇到了困难。我只通过了几个测试用例

我将dp[i][j]定义为要删除的具有有趣矩阵的最小列数。

对于每个字符input[i][j],都有两种可能性。

  1. 如果上一条在字典上是有效的,我们可以输入dp[i][j - 1],而当前输入不会改变任何内容。
  2. 否则,我们检查input[i -1][j]input[i][j]的顺序是否正确,我们认为dp[i][j - 1]还是无效的,因此我们在{{ 1}}

我的儿子。代码

1

1 个答案:

答案 0 :(得分:1)

我们可以遍历从左到右的列,选择那些不会使当前矩阵变得无趣的列。正确实现后,这将花费时间与输入大小成线性关系。

支持该算法的关键事实是,给定了两个有趣的列子集,我们可以将第一个缺少的列添加到另一个列中,而不会使其变得无趣。