我是靠谱客的博主 爱笑小鸭子,最近开发中收集的这篇文章主要介绍动态规划与部分枚举,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

枚举:

        在寻求最优解的时候,最简单的方法便是"枚举"。可别小看了枚举这简单的思路,凡是优秀、高效的程序大多有及其简单的原理。

                1、最大子序列和问题:

                        一串数字序列:1,-1,2,4,-3,6,8,求最大和的连续子序列。

                        枚举所有的子序列:起点为i,结束为j,稍作优化:时间复杂度为O(n^2);

                2、遥远的银河(问题源:la3695)

                        给出平面上n个点,找出一个矩阵,使得边界上包含尽量多的点。

                        枚举所有的矩形(需要压缩一下坐标),左下角坐标为(i,j),宽度和高度为w,h稍作优化,时间复杂度为O(n^4);

                3、最大子矩阵问题(题目源:la3029)

                        一个m*n的矩阵,其中一些格子是空地,其他的是障碍。找出一个全部由空地组成的面积最大的子矩阵。

                        枚举所有的子矩阵,左上角为(i,j)宽度和高度为w,h,稍作优化,时间复杂度为O(m*m*n*n);


部分枚举:

        1、最大子序列和问题:

                只枚举结束序列为j的最长子序列和,即可发现问题具有最优子结构特征:F(j+1) = max(F(j),seq[j]),所以证明这样的部分枚举是可行的,时间复杂度为O(n),稍作优化,空间复杂度为O(1);

        2、遥远的银河(问题源:la3695)

                部分枚举矩形的3边(而不是4边):左边x=l,右边x=r,上边y=i,可以发现问题具有最优子结构F(l,r,i+1)=max(C(i+i)+C(i),C(i+1)+F(l,r,i)-B(i))),其中C(i)表示从x=l,到x=r之间(包括边界上的点)在y=i上的点。B(i)表示不包括边界上的点。时间复杂度降为O(n^3)

                |                |

                |------------|  <i+1

                |------------|  < i

                |                |

                ^               ^

                l                r

        3、最大子矩阵问题(题目源:la3029)

                我曾做尝试这样部分枚举:枚举最右下角点为(i,j)的最大空地矩阵。但是这样做并没有发现子结构特征(但是倘若题目为求最大方阵,则可采用这样的枚举方案,参见数据结构stl一书)。

                在"算法竞赛入门经典-训练指南"一书中,作者给出的是不一样的枚举方式:枚举点(i,j)往上具有最高高度的最宽的矩形,如下图:$为空地,#为障碍

                ##$####

                ##$$###

                ##$$$##

                #$$$$$#

=========分隔符=================

                ##$####

                ##$$###

                ##$$$##

                #$$$$$#

=========分隔符=================

                ##$####

                ##$$###

                ##$$$##

                #$$$$$#

=========分隔符=================

                ##$####

                ##$$###

                ##$$$##

                #$$$$$#

=========分隔符=================

                ##$####

                ##$$###

                ##$$$##

                #$$$$$#

                这样枚举的话便具有最优子结构特征了,
                对于up(i+1,j)而言,up(i+1,j) = up(i,j) + 1;其中up(i,j)代表(i,j)点正上方最长连续空地长度,
                对于left(i+1,j)而言,left(i+1,j) = max(left(i,j),U(i,j)),其中left(i,j)代表上述矩阵左边界离i,j的距离,U(i,j)代表第i行离(i,j)点最近障碍的距离(左边),right(i,j)同理

总结:由最简单的枚举,到高效的部分枚举,原来这就是动态规划的思路。至于如何枚举才能使得问题具有最优子结构特征,这便是下一个将要探索的问题了。




                   






最后

以上就是爱笑小鸭子为你收集整理的动态规划与部分枚举的全部内容,希望文章能够帮你解决动态规划与部分枚举所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部