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;
} 
查看2道真题和解析