📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
查看: 1094| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 动态规划数组声明

全局:

2019(1-3月)-EE硕士+3个月-1年 | Other| 码农类General全职@General

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

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

x
最近复习动态规划的时候发现一个问题,有的时候动态规划数组声明是m+1,有的时候是m, 什么时候声明m, 什么时候声明m+1呢? 谢谢大家
举个例子
Coin change 2  这个就是声明m+1
[color=rgba(0, 0, 0, 0.65)]You are given coins of different denominations and a total amount of money. Write a function to compute the number of combinations that make up that amount. You may assume that you have infinite number of each kind of coin.
[color=rgba(0, 0, 0, 0.65)]

[color=rgba(0, 0, 0, 0.650980392156863)]public class Solution {
[color=rgba(0, 0, 0, 0.650980392156863)]    /**
[color=rgba(0, 0, 0, 0.650980392156863)]    * @param amount: a total amount of money amount. 1point 3acres
[color=rgba(0, 0, 0, 0.650980392156863)]     * @param coins: the denomination of each coin
[color=rgba(0, 0, 0, 0.650980392156863)]     * @return: the number of combinations that make up the amount
[color=rgba(0, 0, 0, 0.650980392156863)]     */
[color=rgba(0, 0, 0, 0.650980392156863)]    public int change(int amount, int[] coins) {. Waral dи,
[color=rgba(0, 0, 0, 0.650980392156863)]        // write your code here
[color=rgba(0, 0, 0, 0.650980392156863)]        int[] dp = new int[amount + 1];
[color=rgba(0, 0, 0, 0.650980392156863)]        dp[0] = 1;. 1point 3acres
[color=rgba(0, 0, 0, 0.650980392156863)]        for (int i = 0; i < coins.length; i++) {
[color=rgba(0, 0, 0, 0.650980392156863)]            for (int j = coins[i]; j <= amount; j++) {
[color=rgba(0, 0, 0, 0.650980392156863)]                dp[j] += dp[j - coins[i]];
[color=rgba(0, 0, 0, 0.650980392156863)]            }-baidu 1point3acres
[color=rgba(0, 0, 0, 0.650980392156863)]        }
[color=rgba(0, 0, 0, 0.650980392156863)]        return dp[amount];
[color=rgba(0, 0, 0, 0.650980392156863)]    }
[color=rgba(0, 0, 0, 0.650980392156863)]}

[color=rgba(0, 0, 0, 0.650980392156863)]
. ----
Unique Paths 这个就是声明m
. 1point3acres.com
. .и
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        for(int i = 0; i<n; i++){
            dp[0][i] = 1;
        }

        for(int i =0; i<m; i++){
            dp[i][0] = 1;
        }
        for(int i=1; i<m; i++){. Waral dи,
            for(int j=1; j<n; j++){
                 dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];.1point3acres
    }
}. 1point3acres.com


评分

参与人数 1大米 +2 收起 理由
Lunluen + 2 给你点个赞!

查看全部评分


上一篇:求买 a collection of data science challenges
下一篇:请问大佬们,谁有oath 雅虎的内推,能帮忙内推下么,着急上岸/(ㄒoㄒ)/~~
🔗
杨超越 2019-3-3 23:30:54 | 只看该作者
全局:
一般而言主要是考虑“什么都不选”的empty的情况下会选择m+1,但m+1的很多情况都是可以用size = m 同时判断是否越界来做。m-1的情况我好像遇到的很少。

评分

参与人数 1大米 +3 收起 理由
limao123 + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| limao123 2019-3-3 23:48:50 | 只看该作者
全局:
被大神翻牌子~~~, 开心,可以没懂,可以具体讲讲吗?谢谢
回复

使用道具 举报

全局:
如果定义的时候是  前i个 那就是m+1 因为前0个默认是default情况

如果定义的是index i的情况下xxxx 那就是m.
这个看个人习惯. 而且你两者多试试就知道了. 有些时候如果需要用m+1 而你用m  就会要多余额外的判断corner cases

评分

参与人数 2大米 +5 收起 理由
Lunluen + 2 很有用的信息!
limao123 + 3 懂了,谢谢

查看全部评分

回复

使用道具 举报

🔗
杨超越 2019-3-4 00:57:58 | 只看该作者
全局:
对应这个题,如果我定义dp[i][j]是我只用前面i个coins来拼出amount = j的最小coins数目
如果用m,那么就需要考虑我什么都不用还能拼出amount = j的情况。那么就需要考虑i-1的时候,也就是i=0时 i-1越界。-baidu 1point3acres
如果用m+1,那么我i其实是从i=1开始的 就不需要考虑i-1 = -1的情况了。
本质上没什么差别

评分

参与人数 1大米 +3 收起 理由
limao123 + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
groundzyy1 2019-3-4 02:30:45 | 只看该作者
全局:
很早前做的总结,不知道现在还有效不

string (match)相关的是(M+1)*(N+1),其他都是M*N

M*N中讨论是有多少种方法可以的,绝大多可以O(N) space解决。

评分

参与人数 1大米 +3 收起 理由
limao123 + 3 懂你的意思了

查看全部评分

回复

使用道具 举报

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

本版积分规则

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