結果
| 問題 |
No.196 典型DP (1)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-03-31 17:22:06 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 447 ms / 2,000 ms |
| コード長 | 1,491 bytes |
| コンパイル時間 | 3,120 ms |
| コンパイル使用メモリ | 88,028 KB |
| 実行使用メモリ | 136,316 KB |
| 最終ジャッジ日時 | 2024-06-24 21:09:42 |
| 合計ジャッジ時間 | 15,445 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 41 |
ソースコード
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
new Main().run();
}
final long MOD=(long)1e9+7;
long ADD(long...a) {
long ret=0;
for(long v:a)ret=(ret+v)%MOD;
return ret;
}
int pointer=0;
void dfs(int cur,int par,ArrayList<Integer>[] g,int[] l,int[] r,int[] v) {
l[cur]=pointer;
v[pointer++]=cur;
for(int dst:g[cur]) {
if(dst==par)continue;
dfs(dst,cur,g,l,r,v);
}
r[cur]=pointer;
v[pointer++]=cur;
}
void run() {
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int[] l=new int[N];
int[] r=new int[N];
int[] v=new int[2*N];
Arrays.fill(l, -1);
Arrays.fill(r, -1);
Arrays.fill(v, -1);
int K=sc.nextInt();
ArrayList<Integer>[] g=new ArrayList[N];
for(int i=0;i<N;++i)g[i]=new ArrayList<>();
for(int i=0;i<N-1;++i) {
int a=sc.nextInt();
int b=sc.nextInt();
g[a].add(b);
g[b].add(a);
}
dfs(0,-1,g,l,r,v);
long[][] dp=new long[2*N][K+1];
for(int i=0;i<dp.length;++i) {
for(int j=0;j<dp[i].length;++j)dp[i][j]=ADD(dp[i][j],i==0?(j==0?1:0):dp[i-1][j]);
if(r[v[i]]==i)continue;
int ni=r[v[i]];
int add=(r[v[i]]-l[v[i]]+1)/2;
for(int cur=0;cur+add<=K;++cur) {
int ncur=cur+add;
dp[ni][ncur]+=(i==0?(cur==0?1:0):dp[i-1][cur]);
dp[ni][ncur]%=MOD;
}
}
System.out.println(dp[2*N-1][K]);
}
static void tr(Object... objects) {
System.out.println(Arrays.deepToString(objects));
}
}