楼主: cjlm007
跳转到指定楼层
上一主题 下一主题
收起左侧

帮朋友发google onsite面经

🔗
sonicgu 2016-1-11 01:29:12 | 只看该作者
全局:
可以根据杨氏矩阵的性质进行剪枝
回复

使用道具 举报

🔗
163 2016-1-11 01:51:25 | 只看该作者
全局:
我觉得我的这个dp应该是work了,结果有701149020种(7亿种,确实很多)。不过是秒出的结果。所以应该是work了
code如下:

int count(int n) {
    map<vector<int>, int> countMap;
    countMap[vector<int>(n, 0)] = 1;
    for (int i = 1; i <= n * n; i++) {
        map<vector<int>, int> newCountMap;
        for (auto cur : countMap) {
            vector<int> curVec = cur.first;
            int curCount = cur.second;
            for (int j = 0; j < n; j++) {
                if ((j == 0 || curVec[j] < curVec[j - 1]) && curVec[j] < n) {
                    curVec[j]++;
                    newCountMap[curVec] += curCount;
                    curVec[j]--;
                }
            }
        }
        countMap = newCountMap;
    }
    return countMap.begin()->second;
}

解释一下:这里是逐个填入1到25的,dp是用在了 “只考虑count,不记录结果” 这一点上面。其中countMap是一个把vector映到int的map,vector就表示当前的选取方法,而int是选取方法对应的count数,
比如vector是 [4,3,2,1,1] 就表示第一行填了前4个,第二行填了前三个这样这样。(因为4+3+2+1+1=11,所以当前一定是在处理i=11这个数)每次一个大循环的loop结束后,newCount里面就存了填入第i个数后,所有的填法以及每个填法对应的count。所有可能的状态数大概是 5! 种(也就是非严格单减序列的个数,比 5!稍多,不过差不太多,)每个状态数会用常数时间(严格来说是 O(5))处理,所以整体的时间比最终的结果数小很多。

评分

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

查看全部评分

回复

使用道具 举报

🔗
163 2016-1-11 01:57:22 | 只看该作者
全局:
另外,如上code使用了map,略微拖慢了运行速度(虽然算5x5的基本看不出来什么区别)。
可以换成一个5x5x5x5x5的数组+queue做bfs,来处理是否访问过的问题。这样会把复杂度扔掉一个log factor

我还做了些其他测试,事实发现这个东西随n增大(这里n=5),那个count数涨的非常快。
n=1: 1
n=2: 2
n=3: 42
n=4: 24024
n=5: 701149020
n=6: 1671643033734960 (已经超出 int的范围了,是用long 算的)

我的code可以跑n=10,大概要3秒左右。复杂度基本是 n! 量级,当然n=10的结果肯定就是错的了,这个count随n增大会迅速变成天文数字。
回复

使用道具 举报

🔗
ninacc 2016-1-11 02:15:59 | 只看该作者
全局:
163 发表于 2016-1-10 12:51
我觉得我的这个dp应该是work了,结果有701149020种(7亿种,确实很多)。不过是秒出的结果。所以应该是work ...

好厉害!!!DFS+backtracing用了剪枝40+秒,是应该用DP做更好,厉害!
回复

使用道具 举报

🔗
2Young2Simple 2016-1-11 06:28:34 | 只看该作者
全局:
Uique Path的follow up 楼主是怎么解决的啊?
回复

使用道具 举报

🔗
say543 2016-1-11 15:28:39 | 只看该作者
全局:
想知道unique path follow -up 怎么解的?
回复

使用道具 举报

🔗
bobzhang2004 2016-2-4 11:43:31 | 只看该作者
全局:
163 发表于 2016-1-11 01:51
我觉得我的这个dp应该是work了,结果有701149020种(7亿种,确实很多)。不过是秒出的结果。所以应该是work ...

不太懂c++ code,这个countMap对应的是java中的hashmap? 那vector<int>是array, 如果这样的话这key有点奇怪啊
回复

使用道具 举报

全局:
两个人一起走那个能先用dp算一个人的 同时刷新矩阵 再用dp算第二个人的 求和。不知道对不对
回复

使用道具 举报

🔗
kittycerry 2016-4-13 03:01:10 | 只看该作者
全局:
kinggarden2001 发表于 2016-2-4 12:27
两个人一起走那个能先用dp算一个人的 同时刷新矩阵 再用dp算第二个人的 求和。不知道对不对

应该走一遍就可以。。。每次取最好的两个
回复

使用道具 举报

🔗
jy_121 2016-4-25 06:40:44 | 只看该作者
全局:
同想问路径和的follow应该怎么考虑
回复

使用道具 举报

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

本版积分规则

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