spin on the RITZ -142ページ目

通学路(動的計画法)

void calc(void)
{
    int t[17][17] = {};
    for (int j=1;j <= a;j++) {
        for (int k=1;k <= b;k++) {
            if (j==1 && k==1)
                t[k][j] = 1;
            else if (point[k][j] == 1)
                t[k][j] = 0;
            else
                t[k][j] = t[k][j-1] + t[k-1][j];
        }
    }
    m = t[b][a];
}



mainはさっきの記事と同じ

動的計画法ってよく出てくるんですけど、使いこなせていないのが現実orz

数学的な思考が足りてませんかそうですか



再帰の場合は計算量が抜群に増えていきますが、動的計画法ではそれほど気になりません。

5番目の一番大きい入力ファイルで時間を測ってみたところ


再帰 : 500ミリ秒

動的 : 0ミリ秒


圧倒的といえば圧倒的ですね。


5番目のファイルの先頭を16 16から19 19に変更するとさらに差が広がります。再帰だと10秒以上かかりますが、動的計画法だと数ミリ秒で終わります。この差はデカイ!

通学路には

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


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のやってみようかしら

情報オリンピック

JOI 2006-2007 予選 問題5 品質検査

のるむさん に教えてもらった情報オリンピックの予選問題を解くことに



大体問題番号が進むにつれ難しくなっていくのですが、ACM-ICPCの問題よりは簡単ですね。

(そりゃ高校生のためのコンテストですからorz)



問題の内容としては、いくつかのテストケースの結果を用いて各パーツの良不良を答えなさい。というシンプルなものです



自分の考えとしては

(1)上手くいったケース(r=1)の時は、そのケースのパーツは良品で確定

(2)良品が2つあるがr=0の時は、残りの一つのパーツが不良品で確定

(3)他のパーツは不良品かどうかわからないことにする


の3ステップを踏んでやりましたが、解答し終えたあとに解説をみたら同じような内容でした



2a+b+c通りの組み合わせを考えて強引に解く方法もあるみたいですが、2のべき乗で計算量が増えるので、現実時間内に解くのは無理でしょうね。最後の入力ファイルは a = b = c = 100 だし。



メモ:

基本的に入力はパイプで

diff <自分の回答ファイル> <公式ページの解答ファイル>

で何も出なけりゃOK!


日本一の大学

アルゴリズムとデータ構造

東京大学の講義資料、2年生のやつらしい


B問題は基本できる(と思う、見た感じは)


Aは解けないやつもあると思う(スパムフィルタはちょっと・・・)



さて、Fラン大の一学生がどこまで出来るでしょうかね

電話帳

電話帳の登録件数の少なさでは定評がある俺ですorz



学校の課題で出たのが、基本情報技術者試験の問題をちょっと変えたやつだったそうです。

確かにちょっといつもの課題とは毛色が違った感じがしたわけよ



電話帳クラスを作れって話なんですが、


メンバ関数は

・新規登録

・削除

・検索

・初期化←いずれコンストラクタを扱うときに直すんだろうなぁ・・・w

+α

・番号にハイフンを付ける

・一覧表示

・登録件数の確認

etc


んでメンバ変数は適当に。



とりあえず上に書いたやつはできたので、並べ替えるやつくらい追加して完成にしちゃおうかな~