C♯の勉強

C♯4.0 で TopCoder の過去問を解きます。

TopCoder SRM585: TrafficCongestion

TrafficCongestionDivTwotreeHeight の上限が 60 から 1000000 になったもの。

漸化式自体は、同じ

dp[i] = (sum 2*dp[j] where j <= i-2) + 1

だけど、これだと O(treeHeight^2) でTLEになる。

合計を求めるところがネックなので、dp[0], ... , dp[i-2]までの和を逐次的に更新して計算量を下げると O(TreeHeight) になる。

public class TrafficCongestion {
    public int theMinCars(int treeHeight) {
        int mod = 1000000007;
        long[] dp = new long[treeHeight + 10];
        dp[0] = 1;
        dp[1] = 1;
        long sum = 0;
        for (int i = 2; i <= treeHeight; i++) {
            sum += dp[i - 2];
            dp[i] = (sum * 2 + 1) % mod;
        }
        return (int)dp[treeHeight];
    }
}