C++での0と1のセグメントの最大長
問題の説明
1と0で構成される文字列が与えられます。タスクは、各セグメントの1の数が0より大きくなるように文字列のセグメントの最大長を見つけることです
例
入力文字列が「10111000001011」の場合、答えは次のように12になります-
- 最初のセグメントの長さは710111000001011
- 2番目のセグメントの長さは510111000001011
- 全長は(セグメント1 +セグメント2)=(7 + 5)=12の長さです
アルゴリズム
- start ==nの場合、0を返します。
- 開始からnまでループを実行し、サブアレイごとにnまで計算します。
- 文字が1の場合は、1のカウントをインクリメントし、そうでない場合は、0のカウントをインクリメントします。
- カウント1が0より大きい場合は、インデックス(k + 1)、つまり次のインデックスの関数を再帰的に呼び出し、残りの長さ、つまりk-start+1を追加します。
- それ以外の場合は、次のインデックスk+1の関数を再帰的に呼び出すだけです。
- dp[start]を返します。
例
#include <bits/stdc++.h> using namespace std; int getSegmentWithMaxLength(int start, string str, int n, int dp[]) { if (start == n) { return 0; } if (dp[start] != -1) { return dp[start]; } dp[start] = 0; int one = 0; int zero = 0; int k; for (k = start; k < n; ++k) { if (str[k] == '1') { ++one; } else { ++zero; } if (one > zero) { dp[start] = max(dp[start], getSegmentWithMaxLength(k + 1, str, n, dp) + k - start + 1); } else { dp[start] = max(dp[start], getSegmentWithMaxLength(k + 1, str, n, dp)); } } return dp[start]; } int main() { string str = "10111000001011"; int n = str.size(); int dp[n + 1]; memset(dp, -1, sizeof(dp)); cout << "Maximum length of segment = " << getSegmentWithMaxLength(0, str, n, dp) << endl; return 0; }
出力
上記のプログラムをコンパイルして実行する場合。次の出力を生成します-
Maximum length of segment = 12
-
C++の壁と門
1つのmxn 2Dグリッドがあり、それがこれら3つの可能な値で初期化されているとします。 -壁または障害物の場合は-1。 ゲートの場合は0。 INFこれは無限大は空の部屋を意味します。 ここで、2 ^ 31-1 =2147483647はINFです。これは、ゲートまでの距離が2147483647未満であると想定できるためです。空の各部屋に、最も近いゲートまでの距離を入力します。ゲートに到達できない場合は、INFで埋める必要があります。 したがって、入力が次のような場合 INF -1 0 INF INF INF INF -1
-
C++で重複する円と長方形
(radius、xc、yc)として表される円があると仮定します。ここで、(xc、yc)は円の中心座標です。また、(x1、y1、x2、y2)として表される軸に沿った長方形があります。ここで、(x1、y1)は左下隅の座標であり、(x2、y2)は右上隅の座標です。長方形の角。円と長方形が重なっていないか確認する必要があります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 関数eval()を定義します。これには、a、b、c、が必要です。 bの最大値とaとcの最小値を返します メインの方法から、次のようにしま