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 ...
随机推荐
- oracle 增加字段
之前很多表增加很多相同的字段,一个一个添加太慢烦了,于是用了以下的方法alter table t_xmlc_batch_out_head_bak add ( SENDRECEIVEFLAG ) , S ...
- sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理
C++并没有规定各种数据类型在内存中的存储大小,依赖于不同的编译器的不同而不同,要想获知当前编译器对各种数据类型分配的大小,可以通过sizeof运算符来获取. 使用方法1: sizeof(数据类型) ...
- Photoshop:路径填充边缘虚化问题
怎么才能不让它虚化呢? 解决方案一: 1.同样画出路径 2.新建图层 3.回到路径面板,右击路径图层,选择“填充路径” 4.把“羽化”设置为0,取消选择“消除锯齿” 换个背景色看看效果:一点虚化都没 ...
- ORA-00911 :无效字符
———————————————————————————————————————————————————— 附: 1 ORA-01790:表达式必须具有与对应表达式相同的数据类型 知识解析:SQL ...
- 验证Android用户输入日期
如何验证用户输入的日期是有效还是无效? private Pattern pattern; private Matcher matcher; private static final String DA ...
- Android性能优化之如何避免Overdraw
什么是Overdraw? Overdraw就是过度绘制,是指在一帧的时间内(16.67ms)像素被绘制了多次,理论上一个像素每次只绘制一次是最优的,但是由于重叠的布局导致一些像素会被多次绘制,而每次绘 ...
- 【转】五种开源协议的比较(BSD, Apache, GPL, LGPL, MIT)
当 Adobe.Microsoft.Sun 等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来! 现今存在的开源协议很多,而经过 Open Source Initiative 组织通过批 ...
- 关于fedora下jdk的安装
http://zhumeng8337797.blog.163.com/blog/static/1007689142012472620637/ alternative命令 http://blog.csd ...
- 在Ubuntu 12.04安装和设置SSH服务
1.安装 Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可. 安装ssh-server sudo apt-get ins ...
- php 连接字符串. ZEND_ASSIGN_CONCAT/ZEND_CONCAT原理
0.php代码 <?php $a='abc'; $b='def'; $c='ghi';$d='jkl'; $a.=$b.$c.$d; 1.BNF范式(语法规则) expr_without_var ...