Easyをパッと思いつけなかった上、Pythonじゃ通らない制約のためC++へ書き直したためタイムロス。そのためMedが解きおわらず。
Div1 Easy SuperSubset
部分和問題なのでDPしようとは思えて、あとは上手く辻褄合わせれば良い。
具体的には、初期値をDP[0]=pow(2,len(A))にして、一つ使ったら自由度が半分になるので、
・DP[i+a]+=DP[i]/2
みたいに遷移させれば良い。
Div1 Med ExpectedValue
コーディングフェーズ終了三分後に解き終わった。
A[i]=jのとき、iとjを結ぶとすると、N個の要素が何個のグループに分けられるかで答えは決まる。
愚直解を書いてグループの個数を調べると、
・DP[i][j]=(DP[i-1][j]*(i-1)+DP[i-2][j-1]*(i-1)
のように推測でき、これで答えを求めたら通った。
以下、Practiceでシステムテストを通ったコード。
mod=10**9+7
DP=[[0],[0],[0,1],[0,2],[0,6,3]]
for i in range(5,1501):
X=[0]*(i//2+1)
for j in range(1,i//2+1):
if i%2==0 and j==i//2:
X[j]=(DP[-2][j-1]*(i-1))%mod
else:
X[j]=(DP[-1][j]*(i-1)+DP[-2][j-1]*(i-1))%mod
DP.append(X)
class ExpectedValue():
def solve(self, N):
S=sum(DP[N])
ANS=0
for i in range(len(DP[N])):
ANS=ANS+i*DP[N][i]
ANS%=mod
return (S*N-ANS)*pow(S,mod-2,mod)%mod
0 件のコメント:
コメントを投稿