查看: 3089| 回复: 12
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 关于DP

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 zh355245849 于 2015-7-31 22:00 编辑

最近刷有关DP的题目,感觉好费力。。。状态转移方程是怎么求出来的啊。。。比如下面这个。。。Maximal SquareThis problem can be solved by dynamic programming. The changing condition is:
t[i][j] = min(t[i][j-1], t[i-1][j], t[i-1][j-1]) + 1. It means the square formed before this point.


上一篇:Merge Two Sorted Lists Submission Result: Memory Limit Exceeded
下一篇:Regular expression matching的疑问
推荐
DK_BurNing 2015-8-1 00:06:20 | 只看该作者
全局:
感觉画图对理解题目很重要,尤其是这种Matrix类的题。

评分

参与人数 1大米 +5 收起 理由
zh355245849 + 5 感谢分享!

查看全部评分

回复

使用道具 举报

推荐
354886 2015-7-31 23:19:56 | 只看该作者
全局:
这道题就是形成一个方形有三种情况,从同一行上一个;同一列上一个;左对角线上一个。那么这个新的方形的边长就应该是这三种情况的最短的那个再加上新的这个点。为什么是最小值呢,因为三种情况如果取最大值也许并不能形成方形,也就是说必须是最小值,就是必须是最苛刻那个边形成的方形才能往下继续。可以画图理解。

评分

参与人数 1大米 +20 收起 理由
zh355245849 + 20 感谢分享!

查看全部评分

回复

使用道具 举报

全局:
本帖最后由 水逼一枚 于 2015-8-4 02:02 编辑
zh355245849 发表于 2015-8-3 19:43
现在的状态就是很多题目照着画发现确实是对的。。。但是叫我自己写写不出来啊。。。

我的思考过程是这样的。你看看对你有没有帮助。先说状态定义。
最初考虑状态定义为dp{i}{j}表示从{0}{0}到{i}{j}的矩形内的最大square的面积area (即定义成问题本身), 这样定义后我们来分析状态转移方程如何写,首先大状态是dp{i}{j}, 显然我们要考虑的一个关键cell是{i}{j}, 如果nums{i}{j}= 0, 则我们知道这个元素的加入一定不会产生更大的square, 因此dp{i}{j} = Math.max( dp{i}{j-1}, dp{i-1}{j}); 如果nums{i}{j} = 1, 那么这个1的加入有可能会产生更大的square也有可能不会产生更大的square. 因此,我们要去判断这个1的加入是否能够组成新的更大的连续为1的边长,但是由于之前的状态记录的是从{0}{0}到某个点的matrix内的最大square面积而并非具体边长是否连续为1的情况,因此我们确定大状态由小状态过来的解的时候似乎还要去遍历元素,这样会造成时间复杂度的增加和问题的复杂性,因此我们考虑换一种状态定义方式。我们再分析一下,每一次子阶段的推进实际上都是考虑某一个点的加入,事实上一个点的加入和square area之间关系并不是最直接的关系,而是经过了一个桥梁就是边长 (因为很直观的推理是一个点的加入最先影响到边长是否有变化),再通过边长去影响square area. 因此,我们重新定义状态dp{i}{j}表示以nums{i}{j}为最右下角元素的全1正方形square的最大边长,这样定义才能把跟之前的连续边长关联起来,其实这是一类问题。就是以某个点为结尾的问题本身定义!!而不是直接以问题本身定义!!类比Lintcode #76 Longest Increasing Sequence题目。然后我们再来讨论状态转移方程,讨论nums{i}{j}为1和为0的两种情况。

评分

参与人数 1大米 +25 收起 理由
zh355245849 + 25 感谢分享!这个我已经看明白了,只是很多dp.

查看全部评分

回复

使用道具 举报

🔗
水逼一枚 2015-8-3 14:54:52 | 只看该作者
全局:
楼主这个题目首先状态定义这一块儿有啥问题没?或者说思考的时候有啥障碍没?
回复

使用道具 举报

🔗
虾米酱 2015-8-3 17:27:18 | 只看该作者
全局:
画图可以看出 ,要想看当前所在位置能形成的最大正方形的边长,如果这一点本身是0就 pass,如果是1 的话就得往前看,要保证形成正方形则得看同一行前一个,同一列前一个,对角线前一个能形成的正方形边长,因为不能含有0,所以得取最小值,加上当前位置,所以+1. 有挺多讲 DP的博客的,你可以把几个题一起看,相似的还有 maximal triangle

评分

参与人数 1大米 +15 收起 理由
zh355245849 + 15 感谢分享!

查看全部评分

回复

使用道具 举报

🔗
 楼主| zh355245849 2015-8-3 19:43:56 | 只看该作者
全局:
水逼一枚 发表于 2015-8-3 14:54
楼主这个题目首先状态定义这一块儿有啥问题没?或者说思考的时候有啥障碍没?

现在的状态就是很多题目照着画发现确实是对的。。。但是叫我自己写写不出来啊。。。
回复

使用道具 举报

🔗
虾米酱 2015-8-3 22:56:16 | 只看该作者
全局:
zh355245849 发表于 2015-8-3 19:43
现在的状态就是很多题目照着画发现确实是对的。。。但是叫我自己写写不出来啊。。。

其实我之前也是,多做做吧,应该会慢慢好起来,同加油

评分

参与人数 1大米 +5 收起 理由
zh355245849 + 5 唉,加油吧。。大学玩废了的感觉。。。

查看全部评分

回复

使用道具 举报

🔗
tltzhsajsdr 2015-8-4 01:16:12 | 只看该作者
全局:
If you can't understand, maybe Try to recite some DP solutions first ?  From my experience, after reciting several DP, I could easily come up with similar solutions. I don't know the mechanism but it does work.

评分

参与人数 1大米 +10 收起 理由
zh355245849 + 10 很有用的信息!

查看全部评分

回复

使用道具 举报

全局:
水逼一枚 发表于 2015-8-4 01:02
我的思考过程是这样的。你看看对你有没有帮助。先说状态定义。
最初考虑状态定义为dp[j]表示从[0][0]到[ ...

嘿嘿,你们都没发现 中括号i中括号 其实是斜体标签么?italics
要表示下标请用DP{i}{j}这样的形式。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表