后面在这里发代码,先占个坑
大致复盘一下题意:
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; }
全部评论
(25) 回帖