[解説]ファンのチケット発行-C ++

背景トピック
前例のないサッカーの試合が開催されます。ファンの長いキューで待機しているゲームのチケットのチケット売り場は、チケットを購入します。

チケットの規定によると、各チケット購入者はチケットを購入し、各チケットの価格は50元です。そこハンドヘルドパーソナルN $ 50枚は、ファンの長蛇の列であり、かつ他のパーソナルハンドヘルドNコインの100元の額面。チケットオフィスで変化がないと仮定すると、チケットの販売を開始しました。これは、チケットをキューイング多くのファンが恥ずかしい状況なしでお金を見つけることができませんどのように2Nの一種です。

タイトルが記述
例えば、N = 2、とファンを示す50元ハンドヘルドの額面が、100 Bと保持ドルファンを表します あなたが別のキューイングの2セットまで取得することができ、導体がお金を見つけることができませんではないでしょう。

最初:AABB

第二:ABAB

[プログラミングタスク]

与えられたn個(0≤n≤20)について、キューイングどのように多くの2Nファンの求める、あなたはお金ではないでしょう切符売り場を見つけることができません。

入出力形式
の入力フォーマット:
Nを表す整数値

出力フォーマット:
プログラムの数を表す整数

サンプル入力出力
入力サンプル#1:
2
の出力サンプル#1:
2
の説明が
開きますQWORD

試験:N = 15

戻る:1秒(タイムアウト)

アナログ・スタック:10分より大きい

再帰アルゴリズム:1秒(タイムアウト)

ダイナミックプログラミング:0 MS

組み合わせアルゴリズム:16のMS

質問の意味:各100元が一致するブラケットを連想させる、その場で一緒に消え、その後、行かなかった$ 50で先行されなければなりません
この質問は(説明あなたがテストした)与えられた方向は非常に明確である
もちろん、唯一の現実的な運用ルールとダイナミックな組み合わせアルゴリズム。
しかし!信じない者はいないDFSグループ4グループ(17,18,19,20)の配列から、20回を良い感じ、再び実行してバックトラックに魚醤をキャッチ
コード:

#include<bits/stdc++.h>
using namespace std;
int n,cnt;
void dfs(int a,int b,int step)
{
    if(b<a)return;
    if(a<0||b<0)return;
    if(step==2*n)
    {
        cnt++;
        return;
    }
    dfs(a-1,b,step+1);
    if(b>=a)dfs(a,b-1,step+1);
}
int main()
{
    cin>>n;
    dfs(n,n,0);
    cout<<cnt<<endl;
    return 0;
}

非常に明確なアイデアが50または100は、非コンプライアンスは直接返すように、コードも非常に簡単です。
しかし、すべての後に、それがああではありません!
まだ与えられた2つの方法が考えられていない頑固なキャッチ魚醤
彼は自分自身を教え、いくつかのCartland膜により膜を倒すと判断
式②のエッセイブログ上のリンクを使用して、私は見てみることができます知ってほしいです。
私はDFSよりもコードがシンプルな期待していなかった...
ラインDFS 21、これはわずか11行のある
コードのミニマリズム:

#include<bits/stdc++.h>
using namespace std;
long long h[20+2]={1,1},n;
int main()
{
    cin>>n;
    for(int i=2;i<=n;i++)
        h[i]=h[i-1]*(4*i-2)/(i+1);
    cout<<h[n]<<endl;
    return 0;
}

OV。

おすすめ

転載: www.cnblogs.com/moyujiang/p/11234332.html