ARC193 B. Broken Wheel
Difficulty:2420
問題文
#ARC193 #ARC
#円環 #DP #円環DP
問題
N+1頂点のグラフがある。頂点0からN-1は、頂点i+1とつながっている(N-1は0と)。
文字列Sのi文字目が1のとき、頂点Nと頂点iがつながっている。
このグラフに向きをつけたときにできる入次数の配列の種類数を数え上げよ。
解法
#円環DP は、円環になっている部分の一個だけ固定して円環じゃなくするのが良くあるテク。今回もこれを使う。
dp[i][j] = i番目の辺まで向きを決めて、最後の向きでありそうなものがjになっているときの数列の種類数
左向き、右向き、どちらもあるの3通りの添え字を持って、3回DPする。
重複が発生するので2を引く。
実装
提出コード
code:cpp
bool solve(){
LL(n);
STR(s);
mint ans{-2};
vector dp(n+1,vector(3,mint(0)));
auto f = &(){
rep(i,n){
if(si=='1'){
//Di == 2
dpi+10 += dpi0;
//Di == 0
dpi+11 += dpi0;
//Di == 1
dpi+12 += dpi0;
//Di == 3
dpi+10 += dpi1;
//Di == 2
dpi+12 += dpi1;
//Di == 1
dpi+11 += dpi1;
dpi+10 += dpi2;
dpi+11 += dpi2;
dpi+12 += dpi2*2;
}
else{
dpi+10 += dpi0 + dpi1 + dpi2;
dpi+11 += dpi0 + dpi1 + dpi2;
dpi+12 += dpi2;
}
}
};
rep(ii,3){
rep(i,n+1)rep(j,3)dpij=0;
dp0ii = 1;
f();
ans += dpnii;
}
O(ans.val());
return true;
}