c++ - 李白打酒有什么解法
PHPz
PHPz 2017-04-17 15:17:05
0
4
1024

李白打酒

话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

我想到过暴力枚举,但是效果似乎不是很好。这个题用DFS算法解决是很好,但是不理解递归的使用。而且回溯的时候,也不知道这样能不能跑完所有情况。在此求助。

PHPz
PHPz

学习是最好的投资!

全員に返信(4)
PHPzhong

再帰を使用したこの質問の答えは 14 です:

  1. ババババババババ

  2. ババアバババババブ

  3. ババアバババババ

  4. ばあばばばばばばば

  5. ばあばばばばばあ

  6. バババババババブ

  7. ばあばbbbbbababb

  8. アババアバババブ

  9. あわあわあわあわあ

  10. あばばばばばばば

  11. あばばばばばあ

  12. あばばばばばばば

  13. アババババババブ

  14. アバブッババババブ

前方再帰に加えて、逆再帰も可能です:

  • 前方: (花,店,酒) = (0,0,2) から開始し、(10,5,0) で再帰的に終了します。

  • 逆方向: (10,5,0)(10,5,0) -> (9,5,1) -> (8,5,2)...から (0,0,2) の終わりまで逆方向に作業します。

手動で 2 つまたは 3 つのステップを推定してみると、逆方向の方法の方が優れていることがわかります。 はアルコール量が偶数の場合のみなので、アルコール量を半分にする店の利用を考える必要があります。フォワード プッシュ方式の各ステップでは、花と店舗という 2 つの状況を考慮する必要があります。実際の実装では、後方推論方法が前方推論方法よりも大幅に優れていることもわかりました。

下の図は、backward メソッドの呼び出しツリーです。円内の数字は各推論ステップ後のアルコールの量、矢印上の文字P(ub)=hotel、F(lowe)r=flower。赤いパスは要件を満たすシーケンスです。再帰呼び出しは合計 149 回あります (中間結果はキャッシュされ、同じ形式の呼び出しは 1 回だけカウントされます)。

下の図はフォワードプッシュメソッドのコールツリーで、ロゴは省略しています。合計 1,051 回の再帰呼び出しがあり、そのほとんどが無駄な作業を行っています。

いいねを押す +0
迷茫

リーリー

前回花に会ったとき、ワインを飲み終わったばかりだったので、最後のbを修正し、問題は5 aと9 bの条件付き配置に単純化され、最終的にワインがバケツ1杯だけ残りました。
質問には、b-1、wine-1、dfs が次のレベルに入り、a-1 が同じ場合に a=0、b=0、wine=1 が満たされるかどうかを確認する状況が 2 つだけあります。
b-1、wine-1、および dfs が次の層に入った後は、b と wine の値を元に戻す必要があることに注意してください。そうしないと、の実行に影響します。以下の発言。

いいねを押す +0
迷茫

当時は再帰を使用していました。

とにかく、穴埋め問題です。

いいねを押す +0
巴扎黑

バイナリ列挙のサブセットを使用して解決できます。

リーリー

上記の解決策は Jisuanke の Blue Bridge Cup コースからの抜粋です。私は船員ではなく、Gmail の sf プッシュを見てこの問題に遭遇しました。ブルー ブリッジ カップについては、Jiaji Garanke が提供するコースを検討してください。このコースには多くの質問があり、世界のファイナリスト 27 名に選ばれた教師が指導します。登録後のリンクはプロモーション用のリンクです。双方ともクーポンをご利用いただけます...

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート