アルゴリズムについての質問です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Kein

アルゴリズムについての質問です。

#1

投稿記事 by Kein » 8年前

もしよろしければ、以下のアルゴリズムの改善方法を教えて頂きたいです。

先にお断りさせていただきます。
とあるサイトの問題で、解けなかった問題です。
そのサイトでの評価に関わるもののようなので、
ここで教えて頂いた改善方法を素に、
再度作成し送信するなどのことを行わないことを宣言しておきます。

また、私が知りたいのは、こういう問題には、
どういう解法(アルゴリズム)が存在するのかを知りたいという純粋な知識欲のみなので、
アルゴリズムの話題についてのみ、記述をお願いします。
また、[1.2]に関する話題のコードに関しては、
軽量化に関するコード以外は絶対に記述しないで頂きたく思います。

[1] 質問文
 [1.1]自分が今行いたい事は何か
入力範囲をnとして、この範囲が[1≦n≦32]の時、
[1.2]と同等の処理を1秒以内に処理できなかった為、
それを可能とするようなアルゴリズムについて学習したいです。

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)

コード:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

inline bool check( const vector<bool>& data )
{

    int a,b;
    a = b = 0;

    for( int i = 0; i < data.size(); ++i )
    {

        if( data[i] )
        {

            if( a < 2 ) return true;

            a -= 2;
            ++b;

        }
        else a += 3;
    }

    return false;

}

int main()
{

    int n;
    cin >> n;

    long long total = 0;

    for( int i = 0; i <= n; ++i )
    {
        vector<bool> data;
        for( int j = 0; j < i; ++j )
            data.push_back( false );
        for( int j = 0; j < n-i; ++j )
            data.push_back( true );

        do
        {
            if( !check( data ) ) ++total;
        }
        while( next_permutation( data.begin(), data.end() ) );

    }

    cout << total << endl;

    return 0;

}


 [1.3]どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
仕様としては、1秒で[1≦n≦32]まで対応可能である必要がありますが、
厳密な計算量まではわかりませんが、n<25の時点で既に無理でした。

 [1.4] 今何がわからないのか、知りたいのか
[1.2]の解法は実直な実装でしかなく、
これ以外の実装方法の検討がつきませんでした。
これより、計算量が減らせるようなアルゴリズムを習得したいので、
そういったアルゴリズムの名称や、上記コードを軽量化する方法などを教えて頂きたいです。

Kein

Re: アルゴリズムについての質問です。

#2

投稿記事 by Kein » 8年前

聞いておいてなんですが、幾らか自己進展がありました。
完全な解決には至っていませんが、
組み合わせが、true,falseのn個の順列からなるグループと等しいことから、
2つの選択肢からなる再起処理にすることで幾らかの速度向上ができました。

Kein

Re: アルゴリズムについての質問です。

#3

投稿記事 by Kein » 8年前

非常に申し訳ありません。

2次元配列を利用することで、
完全に自己解決してしまいましたorz

返信

“C言語何でも質問掲示板” へ戻る