【Luogu p1118] [USACO06FEB]デジタル三角形

フェイス質問

タイトル説明

FJそして彼の牛は精神的なゲームを楽しみます。彼らはから番号を書き留め(1 \)\ $ Nに(1 \ルN \ル10)、特定の順序で$、その後1つの少ない数で新しいリストを生成するために、隣接する数字を合計します。彼らは、単一の番号が残されるまで、これを繰り返します。例えば、ゲームの1つのインスタンス(\(N = 4 \) :)このように行くかもしれない3 1 2 4 4 3 6 7 9 16の背後にFJ、牛は彼らだけから始まる配列を決定しようとした、より困難なゲームをプレイし始めているの背中最終総個数\(N \) 残念ながら、ゲームは少し上回っているFJの暗算能力。ヘルプにプログラムを書くFJゲームをプレイし、牛に追いつきます。

書き込み:そこにこのようなゲームは、\(1 \)\(N \)が配置(a_iを\)\、各隣接する二つの数は、新しいシーケンスを構成し、一緒にし、この新しい配列操作、配列からなる配列の長さよりも明らかに少ないたび\(1 \)一つだけ桁まで、。ここでの例である:\(3,1,2,4 \) \(4,3,6 \) \(7,9 \) \(16 \) 最終的に得られる(\ 16 \) このような数字を。後方今あなたが知っていれば、このようなゲームをプレイしたい\(N \)は、得られるデジタルの大きさを知っている\(SUM \)を、あなたは、元のシーケンスを見つける\(a_iを\) など(1 \)\\(N \)配置。いくつかの可能な答え、出力辞書順最小のものがある場合。

管理者注:このタイトルはここに、辞書編集間違った記述であるを指し\(1,2,3,4,5,6,7,8,9,10,11,12 \)の代わりに、\(1、10、 11,12,2,3,4,5,6,7,8,9 \)

入出力フォーマット

入力形式

二つの正の整数\(N-、SUM \)

出力フォーマット

出力は、\(1 \) 行を辞書順最小の1つの答えです。いいえソリューション、してください出力は何もありません。(グッド素晴らしいああ)

サンプル入力と出力

入力サンプル#1

4 16

サンプル出力#1

3 1 2 4

説明

以下のための\(40 \%\)データ\(n≤7\) ;
のための\(80 \%\)データ\(N≤10 \) ;
のための\(100 \%\)データ\ (N≤12、sum≤12345\)

分析

この質問は明らかに検索されますが、何の脳列挙next_permutation爆発の時の複雑さは、私たちはのように法律を見つけるために、式を押していないかもしれません。
三角形がある場合\(N \)層は、最初の行の数である(\ A_N、\、A_1、A_2 ldots)\、我々は起動することができ(\和)\それの値は?
もし(N- = 1 \)\、その後、答えは明らかである(A_1 \)\ ;
場合(N-2 = \)\、答えが層と、自然の両方ことである\(A_2 A_1 + \) ;
場合\ (N = 3 \。) 三角形を描く:
\ [A_1 \ qquad \クワッドA_2 \ qquad \ \\ A_1 +クワッドA_3 A_2 \ \\クワッドA_2 A_3 A_1 + + + 2A_2 A_3 \]
答えを\(A_1 + 2A_2 A_3 + \)
もし\(N = 4 \。):\
[A_1 \ qquad \ qquad A_2 \ qquad \ qquad A_3 \ qquad \ \\ qquad A_4 A_2 A_1 + \ + qquad A_2 A_3 \ \\ A_4 A_1 qquad A_3 + + + 2A_2 A_3 \クワッドA_2 + 2a_3 + A_4 \\ A_1
+ 3a_2 + 3a_3 + A_4 \] の答え\(A_1 + 3a_2 + 3a_3 + A_4 \)
如果\(N = 5 \) \
[A_1 \ qquad \ qquad \クワッドA_2 \ qquad \ qquad \クワッドA_3 \ qquad \ qquad \クワッドA_4 \ qquad \ qquad A_5 \\ A_1 + A_2 \ qquad \クワッドA_2 + A_3 \ qquad \クワッドA_3 + A_4 \ qquad \クワッドA_4 + A_5 \\ A_1 + 2A_2 + A_3 \クワッドA_2 + 2a_3 + A_4 \クワッドA_3 + 2a_4 + A_5 \\ A_1 + 3a_2 + 3a_3 + A_4 \クワッドA_2 + 3a_3 + 3a_4 + A_5 \\ A_1 + 4a_2 + 6a_3 + 4a_4 + A_5 \]
答案为\(A_1 + 4a_2 + 6a_3 + 4a_4 + A_5 \)
列个表:

\(N \) \(和\)
\(1 \) \(A_1 \)
\(2 \) \(A_1 + A_2 \)
\(3 \) \(A_1 + 2A_2 + A_3 \)
\(4 \) \(A_1 + 3a_2 + 3a_3 + A_4 \)
\(5 \) \(A_1 + 4a_2 + 6a_3 + 4a_4 + A_5 \)
\(6 \) \(A_1 + 5a_2 + 10a_3 + 10a_4 + 5a_5 + a_6 \)
\(\ ldots \) \(\ドット\)

私たちは手紙が唯一の要因を見ていない捨てた場合、どのような結果でしょうか?

\(N \) (\ \テキスト{係数} \)
\(1 \) \(1 \)
\(2 \) \(1,1 \)
\(3 \) \(1,2,1 \)
\(4 \) \(1,3,3,1 \)
\(5 \) \(1,4,6,4,1 \)
\(6 \) \(1,5,10,10,5,1 \)
\(\ ldots \) \(\ドット\)

スマートは、あなたがこのパスカルの三角形で、それを見なければなりません。
そして、それが知られているの対象であることを起こる\(SUM \) オリジナルの式を見つけ、そして(\ N-)\、\ (SUM \)と、元の配列は密接にパスカルの三角形に結びつきました。私達はちょうど対応するフィギュアパスカルの三角形を掛け検索することにより、現在の番号を列挙して、合計が等しいかどうかを確認する必要があります\(SUM \)出力端に等しい場合、。
ここではパスカルの三角形式で前処理することができる:
\ [C ^ C ^ \\ 0_n K_n 1 = = \ {N-FRAC 1-K + K {}。} ^ {K-C 1} _n \。]

コード

#include <iostream>
#include <cstdio>

const int maxn = 25;
int n,sum;
bool vis[maxn];
int ans[maxn];
int c[maxn];

bool dfs(int nownum, int nowsum, int step) {
    if (nowsum > sum) return false;//可行性剪枝
    if (step == n) {
        if(nowsum == sum) {
            ans[n] = nownum;
            return true;
        }
        return false;//同样是可行性剪枝,但评测的时候我没写这句也AC了umm
    }

    vis[nownum] = true;
    for (int j = 1; j <= n; j++) {
        if (vis[j]) continue;
        if(dfs(j,nowsum+c[step]*j,step+1)) {
            ans[step] = nownum;
            return true;
        }
    }

    vis[nownum] = false;//回溯
    return false;
}

void pastri() {
    c[0] = c[n-1] = 1;
    if (n == 1) return ; 
    for (int i = 1; i * 2 < n; i++)
        c[i] = c[n-i-1] = (n-i) * c[i-1] / i;
}//用组合数预处理杨辉三角。

int main() {
    scanf("%d%d",&n,&sum);
    pastri();

    if (dfs(0,0,0)) 
        for (int i = 1; i <= n; i++)
            printf("%d ",ans[i]);

    puts("");
    return 0;
}

レコードのレビュー

AC 100:R30917956

over.

おすすめ

転載: www.cnblogs.com/crab-in-the-northeast/p/luogu-p1118.html