homework-02 一坑到底的最大和联通图
你在这个作业中学到了什么? 有什么好的设计值得分享? 感想如何 (太容易 / 太难 / 太无趣)?
我觉得这套题目有点偏难,我不像大牛那样,有很多算法可以选择,我是0算法基础的,所以遇到这题我一个就是想到我一维的应用,我的一维思想不是动态规划,而是通过最大和的特质即:当一段连续的数的总和小于零时 这段数一定不会与其他段的数字相连,我们设这段数字为连续A段,然后通过统计A段中当前最大的结尾数字的后几位的和,若大于0则加入到最大序列并更改结尾数字,否则继续搜索下一个数字并继续统计当前借位数字的后几位之和再次运算。这样就能保证能对给定的数组统计出多段类似于A段的最长子连续串,然后比较他们的的大小就可以。而拿到这题之后我的第一个想法就是迪杰斯特拉算法,把整个矩阵看做一张图,通过寻找正数的节点间的最短距离,构建一个相对简单的图,然后在对这个只有在正数节点和路径长度的简单的图进行简单地搜索,但是我之后发先一个致命的问题,就是正数节点之间的相连有可能有一部分重复,即A,B,C为正节点,B到A的最短路径与B到C的最短路径之间可能只有一部分是重复的,但是如果在这种情况下还按照我的算法来算的话就会把这一重复的段,重复计算两次。所以这个方法不行。
我之后苦苦思索纠正这个方法的办法,但是发现可能要把所有的点都当成节点,这种情况下复杂度为(n^4),但是在这之上的讨论极为复杂,而作业又是如此急促,所以万般无奈下只能想做出来的大神请教相对简单的方法。看过大家的讨论后,状态压缩dp或联通状态压缩dp是一个出口。大家好像都说状态压缩dp相对好写也好理解,所以先看状态压缩dp,自己做了几道题,然后对这个算法有了一定的理解,发现这道题用状态压缩来解不错,至少思路相对简单,我一开始的状态压缩dp思想复杂度为(n*4^n),主要是通过第i-1行的状态来从i行的2^n个状态中筛选出存在联通可能的状态,然后对筛选出的状态的纵向进行求最大的运算,纵向的意思就是跟自己比,因为第i-1行的多个状态可能对应第i行的同一个状态,所以state(i,k)(0=<k<2^n)(表示第i行的2^n的状态中的一个)中的每一项都有多种取值,但是肯定要取和最大的嘛,因为就连通性来说第i+1行只与第i行的有关所以这是对于i—1行来说,一定要最大的嘛。然后这样就会有一个递推公式state(i,k)=MAX(state(i-1,j)+sum(i,k),sum(i,k)),sum(i,k)为第i行第k个状态的的值,这样的话最后需要处理的只是,结尾判断整个图的连通性的问题,但是显然这个问题有一个最大的难点就是本题的矩阵最大为32*32,而2^32已经是4GB了,如此再开32个就是128GB,肯定行不通的。
又是在万般无奈下,只能选择状态压缩dp复杂度为2^(mn)的算法,偏暴力的。这个就不细说了。最后的作业交的也是这个,实在很抱歉。
但是,灵光一现,在即将交作业的最后一天,我突然有一个优化复杂度(n*4^n)的算法的方法,记得我之前说过的一维的思想吧,一维的思想是把一个一维数组分成几个单独的块,而这些块有一个特点就是如果其中任意一个块的任意一点连接到最佳图上,则这一个快一定会连接到最佳图上,按照这种思路就可以把这一块当成复杂度(n*4^n)的算法中的2^n种可能中的一种,这样的话会大大减少2^n的个数,其次,可以利用状态压缩dp的思想,可以把一行当成一维数组的一个元素,这样的话这道题跟一位数组的题的区别就是n个数中每一个数有优化了的2^n个选择,然后在顶层的想法就是跟一维数组一样。
代码较长,就不在这里贴了,代码里面有注释,有兴趣就看看吧,不过就是无力的暴力,意义不大。
Personal Software Process Stages |
时间百分比(%) |
实际花费的时间 (分钟) |
原来估计的时间 (分钟) |
|
Planning |
计划 |
40 | 400分钟 | 无 |
· Estimate |
· 估计这个任务需要多少时间,把工作细化并大致排序 |
|||
Development |
开发 |
58 | 580分钟 | 无 |
· Analysis |
· 需求分析 (包括学习新技术) |
|||
· Design Spec |
· 生成设计文档 |
|||
· Design Review |
· 设计复审 (和同事审核设计文档) |
|||
· Coding Standard |
· 代码规范 (制定合适的规范) |
|||
· Design |
· 具体设计 |
|||
· Coding |
· 具体编码 |
|||
· Code Review |
· 代码复审 |
|||
· Test |
· 测试(自我测试,修改代码,提交修改) |
|||
Reporting |
总结报告 |
2 | 1小时 | 无 |
|
||||
|
||||
Total | 总计 | 100% | 总用时 | 总估计的用时 |
文章不长,主要在于截图比较少,但都是我经验的体现啊。而且作业也挺无聊的,不如花更多的时间想最后提出的算法上面。如果之后的算法有进展会po在github上面,本文也会持续更新中。
homework-02 一坑到底的最大和联通图的更多相关文章
- Rust入坑指南:坑主驾到
欢迎大家和我一起入坑Rust,以后我就是坑主,我主要负责在前面挖坑,各位可以在上面看,有手痒的也可以和我一起挖.这个坑到底有多深?我也不知道,我是抱着有多深就挖多深的心态来的,下面我先跳了,各位请随意 ...
- 一次shardingjdbc踩坑引起的胡思乱想
项目里面的一个分表用到了sharding-jdbc 当时纠结过是用mycat还是用sharding-jdbc的, 但是最终还是用了sharding-jdbc, 原因如下: 1. mycat比较重, 相 ...
- [Virtualization][SDN] VXLAN到底是什么 [转]
写在转发之前: 几个月以前,在北大机房和燕园大厦直接拉了一根光钎.两端彼此为校园内公网IP.为了方便连接彼此机房,我做个一个VPN server在燕园的边界,北大机房使用client拨回.两个物理机房 ...
- 在Array原型链上扩展remove,contain等方法所遇到的坑
相信jser兄弟们肯定会碰到这样一个问题, 在做数组类的操作的时候,会要求删除数组中的一个元素:亦或是判断某值是否存在于这个数组: OK,拿删除数组元素举例,扩展方法为: Array.prototyp ...
- kmeans聚类中的坑 基于R shiny 可交互的展示
龙君蛋君 2015年5月24日 1.背景介绍 最近公司在用R 建模,老板要求用shiny 展示结果,建模的过程中用到诸如kmean聚类,时间序列分析等方法.由于之前看过一篇讨论kmenas聚类针对某一 ...
- python让你再也不为文章配图与素材发愁,让高清图片占满你的硬盘! #华为云·寻找黑马程序员#
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- Vue2和Vue3技术整理1 - 入门篇 - 更新完毕
Vue2 0.前言 首先说明:要直接上手简单得很,看官网熟悉大概有哪些东西.怎么用的,然后简单练一下就可以做出程序来了,最多两天,无论Vue2还是Vue3,就都完全可以了,Vue3就是比Vue2多了一 ...
- sizzle分析记录:关于querySelectorAll兼容问题
querySelector和querySelectorAll是W3C提供的新的查询接口 目前几乎主流浏览器均支持了他们.包括 IE8(含) 以上版本. Firefox. Chrome.Safari.O ...
- 从一道面试题分析javascript闭包
据说是一不注意就会做错的五道javascript面试题之一,我们来看看这道题长什么样 function Container( properties ) { var objthis = this; fo ...
随机推荐
- Android 显示大图片
主要的代码如下: BitmapFactory.Options options = new BitmapFactory.Options(); //图片解析配置 options.inJustDecodeB ...
- PHP基础语法2
数组 PHP有两种数组:索引数组.关联数组. 函数 自定义函数 自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰 返回值 使用return关键字可以使函数返回值,可以返回包括数 ...
- [itint5]完全二叉树节点个数的统计
http://www.itint5.com/oj/#4 这题是利用完全二叉树的性质计算节点数目.那么是通过比较左右子树的最左结点的高度来看那边是满的,然后递归计算. //使用getLeftChildN ...
- spring 异常管理机制
三.异常处理的几种实现: 3.1.在经典的三层架构模型中,通常都是这样来进行异常处理的: A.持久层一般抛出的是RuntiomeException类型的异常,一般不处理,直接向上抛出. B.业务层一般 ...
- Android:自定义标题栏
现在很多的Android程序都在标题栏上都显示了一些按钮和标题,这里尝试做个实例 在onCreate中添加: //自定义标题 requestWindowFeature(Window.FEATURE_C ...
- string.Join和string.Concat的区别
源自Difference between String.Join() vs String.Concat() With .NET 4.0, String.Join() uses StringBuilde ...
- sizeof(数组)
这里就不讨论一般的数组长度计算了,只说明一下任何数据到了函数的形参中都将退化为指针,所以计算大小的时候,也是计算的指针的大小 直接上代码了 // class sizeof测试.cpp : 定义控制台应 ...
- Hadoop课程介绍
一.课程简介 1. Hadoop是什么? Apache Hadoop是一款支持数据密集型分布式应用并以Apache 2.0许可协议发布的开源软件框架.它支持在商品硬件构建的大型集群上运行的应用程序.H ...
- POJ 2398 Toy Storage
这道题和POJ 2318几乎是一样的. 区别就是输入中坐标不给排序了,=_=|| 输出变成了,有多少个区域中有t个点. #include <cstdio> #include <cma ...
- UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)
题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...