8.17阿里笔试37min 纪念

后面在这里发代码,先占个坑
大致复盘一下题意:
1 求n个节点 高度不超过m的二叉树的个数 结果%1e9+7
dp
dp[i][j]代表i个结点不超过j的方案数
代码:
#include <bits/stdc++.h>
#define int long long 
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define pre(i,a,b) for(int i=(b);i>=(a);i--)
#define ios ios::sync_with_stdio(false),cin.tie(0);
#define pb push_back
#define ps push
#define fi first
#define se second
#define ps push
#define Inf 0x3f3f3f3f3f3f3f3f
#define eps 1e-5
typedef long long ll;
 
const int N=2e5+5;
const int M=2e5+5;
const int mod=1e9+7;
using namespace std;
ll dp[55][55];
signed main()
{
    int n,h;
    cin>>n>>h;
    for(int i=1;i<=n;i++)
    {  
        dp[0][i-1] = 1;
        for(int j=1;j<=n;j++)
        {
            for(int k=0;k<j;k++) 
            {
                dp[j][i] =(dp[j][i]%mod+ dp[k][i-1] * dp[j-k-1][i-1]%mod)%mod;
            }
        }       
    }
    cout<<dp[n][h]<<endl;
    return 0;
}

2。是有n个物品 k个属性 k不超过10 然后求满足ai1+aj1=ai2+aj2=...aik+ajk的对数
就是做差map映射一下就行了
代码:
#include <bits/stdc++.h>
#define int long long 
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define pre(i,a,b) for(int i=(b);i>=(a);i--)
#define ios ios::sync_with_stdio(false),cin.tie(0);
#define pb push_back
#define ps push
#define fi first
#define se second
#define ps push
#define Inf 0x3f3f3f3f3f3f3f3f
#define eps 1e-5
typedef long long ll;
const int N=2e5+5;
const int M=2e5+5;
const int mod=1e9+7;
using namespace std;
map<vector<int>,int>mp;
int a[15];
signed main()
{
    int n,k;
    cin>>n>>k;
    int ans=0;
    for(int i=1;i<=n;i++){
        vector<int>vec;
        for(int j=1;j<=k;j++){
           cin>>a[j];
        }
        for(int j=2;j<=k;j++){
            vec.push_back(a[j]-a[j-1]);
        }
        ans+=mp[vec];
        for(int j=0;j<vec.size();j++){
            vec[j]=-vec[j];
        }
        mp[vec]++;
    }
    cout<<ans<<endl;
    return 0;
}


#阿里巴巴#
全部评论
0.3, 0的麻烦点个赞,求个心里安慰🤐🤐🤐
37
送花
回复
分享
发布于 2020-08-17 20:09
大佬就是大佬,不得不服,37min,题目都不够做,你气不气。 钻研大佬代码的一些理解 二叉树,对与n个结点的二叉树,深度不超过k二叉树个数。 设dp[i][j]是子问题,i个结点不超过深度j的二叉树个数 对于一个二叉树,它的多样性由儿子决定。(因为每个结点都一样,所以谁是根都一样。) 所以,深度为b的树只跟深度为(b-1)的有关,那么对于结点为a个的树,我们枚举一下两个儿子的couple就可以了,具体表示如下 dp[a][b] = dp[a-1][b-1]*dp[0][b-1]+dp[a-2][b-1]*dp[1][b-1]+...+dp[1][b-1]*dp[a-2][b-1]+dp[0][b-1]*dp[a-1][b-1]; 有了方程,剩下的就是就是初始化的问题,迭代式子中多用乘号,对边界的处理, dp[0][b]初始化为1,(因为首位两项,dp[0][x]就是没有啊),其余值的初始化为0即可。 另外一题,ai1+aj1=ai2+aj2=...aik+ajk。对应两行的同列相加是个常数,很容易想到暴力法加哈希优化,但不幸 的是,如果说ai1是原行,ai2是它的搭档行,那么ai3 = ai2 + 常数,都满足结果。没办法记录哈希键值,因为对一个原行,它的搭档行不固定,就没办法记录。 a1+b1 = a2+b2,移项后 a1-a2 = b2-b1,得到楼主的结论 根据这个式子,我们把常数消掉,对与一个固定的原行,它的差分序列对应的搭档行的差分序列是固定的,根据这个特点,利用哈希进行优化。
3
送花
回复
分享
发布于 2020-08-18 00:02
秋招专场
校招火热招聘中
官网直投
30% 50%,第二题感觉能过,不知道哪里有bug,等大佬代码
1
送花
回复
分享
发布于 2020-08-17 19:59
物品属性那题30%是不是都是因为时间复杂度太高了🙄
1
送花
回复
分享
发布于 2020-08-17 20:03
第一题看大佬那个是懂了,暴力是30%; 大佬建一个hashMap<ArrayList<Integer>, Integer>,然后差值存成key,比如 /* 2 10 8 18 10 12 15 7 9 1 1 1 */ 就存成了包括相同差值的hashmap //0 map.get({8,-2}) = 1 (包括2 10 8) //2 map.get({-8,2}) = 2 (包括18 10 12和15 7 9) //3 map.get({0,0}) = 1 (包括18 10 12和15 7 9) * 由于x1+y1 = x2 + y2 -> x1-x2 = -(y1-y2),相反数的ArrayList 从头遍历,将ArrayList中的值变为相反数,get这个相反数List加到count总和上,最后返回总和
1
送花
回复
分享
发布于 2020-08-17 20:30
老哥你倒是发代码呀!!!
点赞
送花
回复
分享
发布于 2020-08-17 19:49
两次了 0.1都不给我a
点赞
送花
回复
分享
发布于 2020-08-17 19:49
30% 20%😥 待会看大佬代码
点赞
送花
回复
分享
发布于 2020-08-17 19:57
第二题一样的思路,python的list不可哈希,用tuple做也不对,哭了
点赞
送花
回复
分享
发布于 2020-08-17 20:03
只A了1.3,枯了
点赞
送花
回复
分享
发布于 2020-08-17 20:04
大佬牛比,第二题我都想不出来怎么动态规划
点赞
送花
回复
分享
发布于 2020-08-17 20:07
为什么我的题目是倒着的
点赞
送花
回复
分享
发布于 2020-08-17 20:09
😂想到了做差,可惜没想到放到map里面,我优化了一点for循环居然有时候40%有时候30%,真神奇
点赞
送花
回复
分享
发布于 2020-08-17 20:11
大佬可以麻烦你稍微详细解释一下吗😂,看你的代码看不懂😂
点赞
送花
回复
分享
发布于 2020-08-17 20:13
巨佬,收下膝盖,好人一生平安
点赞
送花
回复
分享
发布于 2020-08-17 20:15
大佬,能把dp公式的含义说一下吗?
点赞
送花
回复
分享
发布于 2020-08-17 20:21
把两个题目说一下吧,看不懂c+
点赞
送花
回复
分享
发布于 2020-08-17 20:22
树那题动态转移方程没错,初始条件弄错了
点赞
送花
回复
分享
发布于 2020-08-17 20:26
问下楼主阿里的机考题哪里去找题库练呢?LeetCode我练了200来道了,但感觉阿里的题很特别,菜鸡一枚😂,都不知道从何练起
点赞
送花
回复
分享
发布于 2020-08-17 20:55
大佬代码只要一行哈
点赞
送花
回复
分享
发布于 2020-08-17 22:15

相关推荐

头像
不愿透露姓名的神秘牛友
04-29 12:10
点赞 评论 收藏
转发
21 41 评论
分享
牛客网
牛客企业服务