ABC187F Close Group

メモ化再帰めっちゃ遅くてビビった

問題

atcoder.jp

 

解法

要するに繋がってる同士でグループわけができればいい

1つにならない場合は適当にグループ分けして,その分けたグループ内でもできる限り少ないグループ分けになればよさそう→そういうDPを考える(ここまではできた)

集合S内の部分集合を辿っていく際はこう書けばいいらしい

for(int T=S;--T&=S;)

or

for(int T=S;T>0;T=(T-1)&S)

あとは

f(S):集合Sにおけるグループ分けの最小数

Sはそのままで条件を満たす→1

otherwise f(S)=f(S^T)+f(T)としてこれのminをとってやればOK

 

atcoder.jp