在网格中找到大多数K移动和最高分数的路径
Find path in grid with mostly k moves and maximum score
我正在尝试解决以下问题:由正整数的M
网格给出N
,找到一个最大得分,可以从左上角到右下角。路径的分数是您在上述路径上收集的所有值的总和(在同一单元格上停留是可能的转弯(。同样,路径的长度必须主要是L
。例如:假设我们有以下网格(N = 5
,M = 6
(:
1 1 1 1 1 1
10 10 1 1 1 1
1 10 1 10 10 10
1 10 10 10 1 10
1 1 1 1 1 1
如果L = 10
,答案应为83。
1
10 10
10
10 10 10 1 10
1
并在10个转弯之一上停留。
如果L = 11
,答案应为102。您可以通过在原始网格中遵循10路径来得到。
我提出了复杂性o(n^2*m^2*l(的算法,但这太慢了,因为n和m可以达到100,而L可以达到1000。我的算法的基本想法如下:计算每个元组(i1, j1, i2, j2, k)
的答案,其中(i1, j1)
是起始单元,(i2, j2)
是目标单元格,而k
是路径长度。我从k = 0
开始,然后延长到L
。您对我如何优化这个想法有任何建议吗?甚至对问题的全新见解?
一种可能的方法是为表格的每个元组进行计算( i , j , k (,长度路径的最大分数恰好 k ,从单元格(0,0(开始,以( i , j 。让我们将此值表示为最佳( i , j , k (。
按照惯例,如果没有长度k的路径k从(0,0(开始,并以( i , j (结尾,我们希望拥有最好的( i , j , k (= -Infinity。
对于 k = 1,有一个长度1的单个路径,该路径从上左上角开始,因此:
:- 最佳(0,0,1(= input_matrix(0,0(。
- 最佳( i , j ,1(= -Infinity,如果( i , j (为不是(0,0(。
对于 k > 1我们可以使用最佳( i , j , k (的值来计算。最佳( *, *, k -1(:
best( i , j , k (= input_matrix( i , j em>( max(best( a , b , k -1((,其中 max
被所有 a, b ,使得单元格( a , b (是细胞的邻居( i j (。
现在,已经构建了最佳矩阵,可以通过计算来找到原始问题的答案:
max(best( n -1, m - 1, k ((,其中 max
被占用了所有k 在1和 l 之间。
这种方法的复杂性是 o (n·m·l(。
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- 从函数角度看ID到文件路径的内部与外部映射
- boost xml parsingl将xml的路径作为变量发送
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何使用cppcheck处理半相对包含路径
- 在C++中设置基于操作系统的文件路径
- 基于编译器选项的编译二进制路径
- 按边长度递归搜索图中所有可行路径
- 使用变量值作为 PlaySound 中的路径
- 如何转换真实路径 CString c++
- 从 GUID 获取 USB 卷路径
- 查找 GCD:并非所有控制路径都返回值
- 显示数组中的学生 ID 和最高分
- C++17 文件系统::remove_all 带有通配符路径
- 在带有尾部斜杠的路径上返回 std::filesystem::create_directories() 的值
- 获取当前正在运行的 exe 名称(不是路径)
- 如何从 Skia 路径几何体中获取网格?
- CMake 错误"源似乎不包含 CMakeLists.txt",路径/库连接问题