先にお断りさせていただきます。
とあるサイトの問題で、解けなかった問題です。
そのサイトでの評価に関わるもののようなので、
ここで教えて頂いた改善方法を素に、
再度作成し送信するなどのことを行わないことを宣言しておきます。
また、私が知りたいのは、こういう問題には、
どういう解法(アルゴリズム)が存在するのかを知りたいという純粋な知識欲のみなので、
アルゴリズムの話題についてのみ、記述をお願いします。
また、[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秒で[1≦n≦32]まで対応可能である必要がありますが、
厳密な計算量まではわかりませんが、n<25の時点で既に無理でした。
[1.4] 今何がわからないのか、知りたいのか
[1.2]の解法は実直な実装でしかなく、
これ以外の実装方法の検討がつきませんでした。
これより、計算量が減らせるようなアルゴリズムを習得したいので、
そういったアルゴリズムの名称や、上記コードを軽量化する方法などを教えて頂きたいです。