目次
トピック: 93. 組み合わせ列挙の再帰的実装 - AcWing Question Bank
前に書かれています:
ブルーブリッジカップから1ヶ月も経たないうちに、
川や湖の噂によると、
Blue Bridge Cup のお気に入りのテストは、深さ優先探索と動的計画法です。
そのため、蘭橋杯は包祖杯、DP杯とも呼ばれています。
それからもちろん、深さ優先検索、いわゆる dfs から始めて、ゲームの準備をしました。
トピック: 93. 組み合わせ列挙の再帰的実装 - AcWing Question Bank
質問を読む:
入力形式:
同じ行にスペースで区切られた 2 つの整数 n、m。
出力フォーマット:
すべてのスキームを昇順で、各行に 11 ずつ出力します。
まず、同じ行の番号を昇順に並べ、隣接する 2 つの番号をスペースで区切ります。
次に、2 つの異なる行について、添字に対応する数字を 1 つずつ比較し、辞書式順序が小さい方を 1 位にランク付けします。
(例: 1 3 5 7
トップ 1 3 6 8
)。
データ範囲:
n > 0,
0 ≤ m ≤ n,
n + (n − m) ≤ 25
入力サンプル:
5 3
出力例:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
問題解決のアイデア:
この質問は、深さ優先探索の古典的な質問です。
深さ優先探索を使うと、
最初に注意すべき点は、
私たちが書いた再帰構造は、すべてのケースをトラバースできます。
検索を初めて学ぶとき、再帰的な検索ツリーの観測を描画する必要があります。
再帰は非常に抽象的で、絵を描くことで問題を解決することができます。(上記の再帰的検索の基本的な考え方に慣れておくことは常に良いことです)
次に具体的な考え方です。
タイトルの要件は、n 個の数字から m 個を選択し、さまざまなオプションを出力することです。
そして、昇順に並べる必要があり、辞書順は前が小さく、
アイデアを理解するために、最初に再帰的な検索ツリーを描きましょう。
1 つ目はルート ノードです (例として n=5、m=3 を取り上げます)。
私の考えは、場所に応じてデータを入力することです.
タイトルには昇順の配列が必要なため、最初の数字は 1、2、3 のみです。
トピックの昇順の要件に従って、
次に、再帰的に検索を続けます。
再帰的に検索を続けます:
最後の行は、出力する必要がある値です。
次に、グラフィックスをコードに実装します。
コード:
//养成好习惯,把常用头文件包了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
//根据题目要求决定数组大小
const int N = 30;
int n, m;
int st[N];
void dfs(int u, int start)
{
//如果递归到底
if(u == m)
{
//输出
for(int i = 0; i < m; i++)
{
printf("%d ", st[i]);
}
puts("");
return;
}
else
{
//不重复使用数字
for(int i = start; i < n; i++)
{
st[u] = i + 1;
dfs(u + 1, i + 1);
st[u] = 0;
}
}
}
int main()
{
scanf("%d %d", &n, &m);
dfs(0, 0);
return 0;
}
交流 !!!!!!!!!!
最後に書く:
以上がこの記事の内容です、お読みいただきありがとうございます。
この記事が気に入ったら、いいねとコメントをお願いします。また、ご意見をお書きください。
私と一緒にプログラミングを学びたい場合は、私に従ってください。私たちは一緒に学び、成長します。
今後もより質の高いコンテンツを出力していきますので、よろしくお願いします。