2010年8月17日火曜日

AOJ Volume 1 Problem 0157 : Russian Dolls


#include <iostream>
#include <map>
using namespace std;

int main()
{
    int n, r, h;
    while (cin >> n, n)
    {
        // longest increasing subsequence: lis
        int k = 0, lis[200] = {0};
        multimap<int, int> dolls;

        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cin >> r >> h;
                dolls.insert(pair<int, int>(r, h));
            }
            if (! i)
                cin >> n;
        }

        for (multimap<int, int>::iterator p = dolls.begin();
             p != dolls.end(); p++)
        {
            for (multimap<int, int>::iterator q = dolls.begin();
                 q != p; q++)
            {
                if (p->first > q->first && p->second > q->second)
                {
                    if (lis[distance(dolls.begin(), p)] 
                        <= lis[distance(dolls.begin(), q)])
                    {
                        lis[distance(dolls.begin(), p)] 
                            = lis[distance(dolls.begin(), q)] + 1;
                        if (k < lis[distance(dolls.begin(), p)])
                            k = lis[distance(dolls.begin(), p)];
                    }
                }
            }
        }
        cout << k + 1 << endl;
    }

    return 0;
}

I fill my spare time on the Web site of "AOJ".
What's "AOJ?"
AOJ stands for Aizu Online Judge.

他にもオンラインジャッジはUva Online Judgeなどありますが,
会津大学のオンラインジャッジは,パソコン甲子園などの日本語の問題も幅広く取り扱っていて
高校, 高専, 大学のプログミング部や同好会は結構使っているんじゃないかなぁと思います.
コードを書いて基礎体力?とアルゴリズムを勉強していきたい人には打って付けだと思います.

上のコードはDPを用いて解いたものです.
最長増加部分列を求めるような問題でした.
たぶん,コードを見ればその人との力量が分かると思うんで,
今こんな感じですが, 今後も励んでちっとでも美しく書けるように頑張りたいと思います.

0 件のコメント:

コメントを投稿