通学路には | spin on the RITZ

通学路には

誰も知らない秘密なんたらかんたら。誰の歌だっけ?


JOI 2006-2007 予選 問題6


いかにも高校生らしい問題ですねコレ。昔は無理やり数えてテストで回答したことがありました(笑)

相変わらず自分の中に無理矢理さは残っているようです


ソース短いので載せときます


#include <iostream>

int point[17][17];
int a, b, m, n;

void calc(int x=1, int y=1)
{
    if (x == a && y == b) {
        m++;
        return;
    }
    if (point[y][x+1] != 1 && x+1 <= a)
        calc(x+1, y);
    if (point[y+1][x] != 1 && y+1 <= b)
        calc(x, y+1);
}

int main()
{
    int x, y;

    cin >> a >> b;
    cin >> n;
    for (int i=0;i < n;i++) {
        cin >> x >> y;
        point[y][x] = 1;
    }
    calc();
    cout << m << endl;

    return 0;
}


とりあえず、いちばんわかりやすい方法でしょうね。強引に解くってのは。

縦横それぞれ最大16ってのと、入力ファイルが上手い具合に作られてるので5番目の入力ファイルでも時間はほとんどかかりません。

intとかlongの上限が42億程度(unsigned指定)なので、それほど計算量がかかる経路は作れないはず

まぁ、スマートな方法とは言えません。再帰はすっきり書けるけどね



解説の方では

・二重forループ(DPっぽい)

・再帰

・全数調査


の3つが挙げられてますね。DPのやってみようかしら