C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で最も高いビルボード


ビルボードを設置していて、それを最大の高さにしたいとします。ビルボードには、両側に2つのスチールサポートがあります。各サポートは同じ高さである必要があります。また、溶接可能なロッドのコレクションもあります。したがって、長さ1、2、および3のロッドがある場合は、それらを溶接して長さ6のサポートを作成できます。ビルボードの設置で可能な限り最大の高さを見つける必要があります。ビルボードをサポートできない場合は、0を返します。

したがって、入力が[1,2,2,3,3,3,4]のような場合、[1,2,2,4]や[3,3、 3]。

これを解決するには、次の手順に従います-

  • 合計:=0、n:=ロッドのサイズ、N:=2 * 5000

  • 1つの2D配列dp(n + 1)x(N + 1、-1)を定義します

  • dp [0、5000]:=0

  • 初期化i:=0の場合、i

    • 初期化j:=0の場合、j <=Nの場合、更新(jを1増やします)、実行-

      • x:=ロッド[i]

      • j --x> =0で、dp [i、j --x]が-1に等しくない場合、-

        • dp [i + 1、j] =dp [i + 1、j]およびdp [i、j-x] + x

          の最大値
      • j + x <=Nであり、dp [i、j + x]が-1に等しくない場合、-

        • dp [i + 1、j] =dp [i + 1、j]およびdp [i、j + x]

          の最大値
      • dp [i、j]が-1に等しくない場合、

        • dp [i + 1、j] =dp [i、j]およびdp [i + 1、j]の最大値

  • dp [n、5000]

    を返します

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int tallestBillboard(vector<int>& rods){
      int sum = 0;
      int n = rods.size();
      int N = 2 * 5000;
      vector<vector<int> > dp(n + 1, vector<int>(N + 1, -1));
      dp[0][5000] = 0;
      for (int i = 0; i < n; i++) {
         for (int j = 0; j <= N; j++) {
            int x = rods[i];
            if (j - x >= 0 && dp[i][j - x] != -1) {
               dp[i + 1][j] = max(dp[i + 1][j], dp[i][j - x] +
               x);
            }
            if (j + x <= N && dp[i][j + x] != -1) {
               dp[i + 1][j] = max(dp[i + 1][j], dp[i][j + x]);
            }
            if (dp[i][j] != -1) {
               dp[i + 1][j] = max(dp[i][j], dp[i + 1][j]);
            }
         }
      }
      return dp[n][5000];
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,2,3,3,3,4};
   cout << (ob.tallestBillboard(v));
}

入力

{1,2,2,3,3,3,4}

出力

9

  1. C++での質素な数

    この問題では、正の整数Nが与えられます。私たちのタスクは、与えられた数が質素な数であるかどうかをチェックするプログラムを作成することです。 不正な番号 −指定された数の素因数分解の桁数よりも厳密に桁数が多い数。 例 − 625、数625の素因数は5 4です。 。 625の桁数は3です。 5 4の桁数 は2です。 3は厳密に2より大きくなります。したがって、625は質素な数です。 最初のいくつかの質素な数は − 125、128、243、256、343、512、625など。 問題を理解するために例を見てみましょう Input: n = 128 Output: Frugal n

  2. C++五胞体数

    五胞体数は、パスカルの三角形の5番目の数として表されます。ご存知のように、これは5番目の数字です。つまり、パスカルの三角形に少なくとも5つの数字が必要です。したがって、このシリーズの最初の数字は 1 4 6 4 1から始まります。 パスカルの三角形の4行目。したがって、このチュートリアルでは、たとえば、n番目の五胞体数を見つける必要があります Input : 1 Output : 1 Input : 4 Output : 35 次の図から出力を確認できます- この問題については、可能な限り、これは一種のシリーズであるため、ソリューションでこのシリーズのパターンを見つけようと