結果
問題 |
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)); } }