ABC 130 E - Common Subsequence
共通部分列で末尾がSxかつTyであるものの総数をf(x,y)とすると、求める数は(空の文字列を含めるので)1+∑1≤x≤N,1≤y≤Mf(x,y)である。fの漸化式は
f(x,y)={0∑i<x,j<yf(i,j)+1(Sx=Ty)(Sx=Ty)
と書けるが、このままDPすると間に合わないので累積和S(x,y)=∑1≤i≤x,1≤j≤yf(i,j)を使って遷移する。
f(x,y)=S(x−1,y−1)+1(Sx=Ty)S(x,y)=S(x−1,y)+S(x,y−1)−S(x−1,y−1)+f(x,y)
だから、Sについて整理すると
S(x,y)={S(x−1,y)+S(x,y−1)−S(x−1,y−1)S(x−1,y)+S(x,y−1)+1(Sx=Ty)(Sx=Ty)
2次元累積和上でDPすればよさそうというのは早い段階で検討がついたが、初めてだったせいか式を立てている最中にoff-by-oneの誤りをやって時間を消費した。そのままハマってしまう危険を感じたのでひとまず2次元BITを試したら通って事なきを得た。
この問題に関しては、2次元累積和の遷移の式を陽に覚えていれば済むことではあったので、知識が増えたと思っておく。ただ、0-based、半開区間で処理するとき、累積和絡みの考察でよく混乱しているのも確かなので、一度整理したい。