樹DP 初始化有個小技巧
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned int uii;
const ll mod=1e9+7;
int n,k,u,v;
ll dp[105][45],f[45];
bool vis[105];
vector<int> vec[105];
void dfs(int u) {
vis[u]=true;
dp[u][0]=dp[u][k+1]=1;
for (uii t=0;t<vec[u].size();++t) {
int v=vec[u][t];
if (vis[v])
continue;
dfs(v);
memset(f,0,sizeof f);
for (int i=0;i<=2*k;++i)
for (int j=0;j<=2*k;++j)
if (i+j<=2*k)
f[min(i,j+1)]=(f[min(i,j+1)]+dp[u][i]*dp[v][j])%mod;
else
f[max(i,j+1)]=(f[max(i,j+1)]+dp[u][i]*dp[v][j])%mod;
memcpy(dp[u],f,sizeof dp[u]);
}
}
int main()
{
scanf("%d%d",&n,&k);
for (int i=0;i<n-1;++i) {
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
dfs(1);
ll res=0;
for (int i=0;i<=k;++i)
res=(res+dp[1][i])%mod;
printf("%lld\n",res);
return 0;
}