C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. 【C++】動的計画法(DP)で最大合計増加部分列を求める方法

    本記事では、サイズ n の配列 arr[] が与えられたとき、動的計画法(Dynamic Programming:DP)を用いて「最大合計増加部分列(Maximum Sum Increasing Subsequence)」を求めるC++プログラムを解説します。問題の概要最大合計増加部分列とは、各要素が直前の要素より大きいという条件を満たす部分列(Subsequence)の中で、要素の合計が最大となるものを指します。つまり、単調に増加しながら、かつ合計値が最も大きくなるような部分列を見つけることが目的です。具体例で問題を理解しよう入力arr[] = {4, 2, 3, 6, 5, 9}出力20解

  2. 【C++】バイナリインデックスツリー(BIT)で最大合計増加部分列を効率的に求める方法

    この問題では、n 個の整数からなる配列 arr[] が与えられます。目的は、バイナリインデックスツリー(Binary Indexed Tree / BIT)を活用して、C++ で「最大合計増加部分列」を求めるプログラムを作成することです。問題の概要配列の要素を用いて、合計値が最大になる増加部分列を見つける必要があります。増加部分列とは現在の要素の値が、直前の位置にある要素の値よりも常に大きくなっているような部分列のことです。バイナリインデックスツリー(BIT)とは木構造の一種であるデータ構造で、要素の追加や更新(累積値の管理)を効率的に行うことができます。累積和や累積最大値の高速な取得に適して

  3. C++でn個の配列から昇順に選んだ要素の最大合計を求めるプログラム

    この問題では、サイズ n×m の2次元行列が与えられます。私たちのタスクは、n 個の配列(行)から昇順となるように要素を選び、その合計の最大値を求めるプログラムを作成することです。問題の概要各行から1つずつ要素を選び、i 行目で選んだ要素が (i+1) 行目で選んだ要素より小さくなるようにします。この条件を満たす選び方の中で、合計が最大になるものを求めます。条件を満たす組み合わせが存在しない場合は、解が存在しないことを示す -1 を返します。入力例と出力例入力mat[][] = { {4, 5, 1, 3, 6}, {5, 9, 2, 7, 12}, {13, 1, 3

  4. C++の動的計画法を用いて二分木内の互いに隣接しないノードの最大合計を求める方法

    この問題では、各ノードに値が設定された二分木が与えられます。動的計画法(DP)を活用し、選択したノード同士が互いに隣接しないという条件下で、二分木のノード値の合計として考えられる最大値を求めるプログラムを作成することが課題です。 問題の詳細 二分木の中からノードの部分集合を選び、合計値を最大化します。ただし、選んだノード同士が直接的な親子関係でつながっていてはなりません。つまり、あるノードを選んだ場合、その親ノードおよび子ノードは選択できないという制約があります。 入力例 出力例 24 解説 この例では、合計に含めるノードは以下のとおりです。 8 + 5 + 9 + 2 = 24 解法のアプ

  5. 特定の差を持つペアの最大合計を求めるC++プログラム

    問題の概要この問題では、n個の整数からなる配列 arr[] と数値 d が与えられます。求めるのは、要素間の差が d 未満となるペアの中で、その合計が最大になる組み合わせを見つけることです。問題の詳細: ペアを構成する2つの要素の差が d より小さくなるようにペアを作成し、それらのペアの要素の合計が最大となるようにします。入出力例入力:arr[] = {5, 9, 11, 7, 2, 12, 3}, d = 5出力:47説明:最大合計に寄与するペア: (3, 5), (7, 9), (11, 12)合計 = 3 + 5 + 7 + 9 + 11 + 12 = 47解法アプローチ最も単純な方法は

  6. 負の値を含む配列でペアワイズ積の最大合計を求めるC++プログラム

    この問題では、n個の整数(負の値も許容)からなる配列 arr[] が与えられます。目的は、負の値が含まれる場合でも、要素ペアの積の合計が最大となるようにペアを作成するプログラムを作ることです。 問題の概要 配列の要素を用いてペアを作り、各ペアの積を足し合わせたときに合計が最大になるような組み合わせを見つける必要があります。 具体例で問題を確認しましょう。 入力 arr[] = {−5, 2, 3, 7, −1, 1, −3, 12} 出力 104 説明 選ぶペア:(−5, −3), (2, 3), (−1, 1), (7, 12) 積の合計 = (−5 × −3) + (2 × 3) + (−

  7. C++で配列の最小値と2番目に小さい値の最大合計を求める方法

    この問題では、整数型の配列 arr[] が与えられます。求めるのは、配列の各部分配列における「最小値と2番目に小さい値の合計」の中で最大となる値です。 問題の説明 配列から取り得るすべての部分配列(連続する要素の並び)を考えます。それぞれの部分配列について、含まれる要素のうち最も小さい値と2番目に小さい値を足し合わせ、その合計が最大になるものを答えとして返します。 入出力例 入力 arr[] = {3, 5, 4, 2, 9, 1, 6} 出力 11 解説 すべての部分配列の中で、 {2, 9} のとき「最小値+2番目に小さい値」の合計が最大になります。 合計 = 2 + 9 = 11 解法の

  8. C++で2つの配列の積の合計を最大化するプログラムの解説

    この記事では、サイズnの2つの配列 arr1[] と arr2[] が与えられたとき、対応する要素同士の積の合計が最大になるように計算するC++プログラムを紹介します。問題の概要arr1 の1つの要素と arr2 の1つの要素を掛け合わせた積を、すべての要素について求め、その合計が最大になる組み合わせを見つけるのが目的です。入力例arr1[] = {3, 5, 6} arr2[] = {1, 4, 2}出力例37解説積の最大合計:6×4 + 5×2 + 3×1 = 24 + 10 + 3 = 37解法のアプローチ最も単純な方法は、arr1 と arr2 のすべての要素ペアを列挙し、その中から最

  9. C++プログラムで解く!行列内の往復パスにおける最大合計の求め方

    この問題では、サイズ n×m の行列 mat[][] が与えられます。求めるのは、行列を上から下へ進み、その後再び上へ戻る一連の経路の中で、通過したセルの合計値が最大になるパスです。本記事では、その解法をC++プログラムとともにわかりやすく解説します。 問題の説明 左上のセル mat[0][0] から右下のセル mat[n−1][m−1] までの経路と、そこから再び mat[0][0] へ戻る経路の2つを見つけ、それぞれの合計値の和を最大化することが目的です。 有効な移動 mat[0][0] から mat[n−1][m−1] へ:  ・右へ移動(mat[i][j] → mat[i][j+

  10. C++プログラム:配列内で要素間の距離がK未満にならない部分列の最大合計を求める方法

    この問題では、サイズnの配列arr[]と整数kが与えられます。求めるのは、配列内でどの2つの要素も距離がk未満にならないように選んだ部分列(サブシーケンス)の合計の最大値です。問題の概要配列から要素を選んで部分列を作るとき、選んだ任意の2つの要素のインデックス差がk以上になるようにする必要があります。その制約のもとで、部分列の要素の合計が最大になる組み合わせを見つけるのが目的です。入力例arr[] = {6, 2, 5, 1, 9, 11, 4}k = 2出力例16説明条件を満たす部分列の候補:{6, 1, 4} → 合計 = 11{2, 9} → 合計 = 11{5, 11} → 合計 =

  11. C++プログラム:先頭と末尾の値が同じになる最大合計部分配列を求める方法

    この問題では、正の整数のみから構成されるサイズnの配列arr[]が与えられます。求めるのは、部分配列(サブ配列)の先頭要素と末尾要素が同じ値であるようなものの中で、要素の合計が最大となる部分配列です。問題の概要ここでの課題は、部分配列の開始インデックスiと終了インデックスjにおける要素が等しい、すなわち arr[i] == arr[j] を満たす部分配列を見つけ出し、その要素の合計を最大化することです。入力例arr[] = {2, 1, 3, 5, 6, 2, 4, 3}出力例23説明先頭と末尾が同じ要素になっている部分配列は以下の通りです。 {2, 1, 3, 5, 6, 2} = 2 +

  12. C++でインデックス間隔がk以上の最大合計部分列を求めるアルゴリズム

    問題概要 サイズnの配列arr[]と整数kが与えられたとき、選んだ要素同士のインデックスがk以上離れている部分列の中で、合計が最大になるものを求めるプログラムを作成します。 問題の詳細 配列から要素を選んで部分列を構成します。このとき、選ばれた要素のインデックス同士は互いにk以上の距離を持つ必要があります。その条件を満たすすべての部分列の中から、合計値が最大となるものを見つけましょう。 入力例 arr[] = {2, 3, 7, 9, 2, 8, 3} 出力例 15 解説 条件を満たす部分列の例は以下の通りです。 {2, 9, 3} → 合計 = 14 {3, 2} → 合計 = 5 {7,

  13. 隣接する2つの要素を選ばない最大部分列和を求めるC++プログラム|動的計画法による別解

    問題概要この問題では、正の整数からなるサイズ n の配列 arr[] が与えられます。求めるのは、配列内で隣接する2つの要素を同時に選択しないという制約のもとで、部分列の合計が最大になる組み合わせを見つけることです。入出力例入力:arr[] = {5, 2, 1, 9, 6}出力: 14説明: 条件を満たす部分列には以下のようなものがあります。{5, 1, 6} → 合計 = 5 + 1 + 6 = 12{2, 9} → 合計 = 2 + 9 = 11{5, 9} → 合計 = 5 + 9 = 14(最大)解法アプローチ:動的計画法(DP)ここでは、動的計画法を用いた効率的な別解を紹介します。

  14. C++で配列の最大重み差(Maximum Weight Difference)を求める方法

    この記事では、配列 arr[] と整数 M が与えられたとき、C++ を使って最大重み差(Maximum Weight Difference)を計算する方法を解説します。 問題の概要 配列の中から M 個の要素を選び、選んだ要素の合計と残りの要素の合計との絶対差が最大になるようにします。 具体例で確認してみましょう。 入力例 arr[] = {3, 1, 6, 9, 4} M = 3 出力例 15 説明 この例では 4、6、9 を選びます。その合計は 19 です。残りの要素(3 と 1)の合計は 4 なので、絶対差は次のように計算できます。 |19 − 4| = 15 解法アプローチ 最も単純

  15. C++で有理数を10進数表記の文字列に変換する方法(循環小数対応)

    問題概要 分子(numerator)と分母(denominator)の2つの整数で、有理数「分子 / 分母」を表すことを考えます。この値を10進数表記の文字列として求めます。小数部分に循環する数字(循環節)が含まれる場合は、その部分を括弧 ( ) で囲んで表現します。 たとえば、入力が numerator = 164、denominator = 3 の場合、164 ÷ 3 = 54.666… となるため、出力は「54.(6)」となります。 アルゴリズムの考え方 この問題は、筆算の割り算をコンピュータ上でシミュレートすることで解決できます。手順は以下の通りです。 分子が0の場合は、そのまま「

  16. C++で1つの文字列を別の文字列へ変換する最短操作列を求めるプログラム

    問題の概要 2つの文字列 S と T が与えられます。S を T に変換するための最短の操作列を見つける必要があります。ここで使用できる操作は、基本的に「1文字の削除」または「1文字の挿入」のいずれかです。 例えば、入力が S = xxxy、T = xxyy の場合、出力は [x, x, -x, y, +y] となります。これは「最初の2つの x をそのまま配置し、3番目の x を削除(-x)、その後 y を配置し、最後に新しい y を挿入(+y)する」ことを意味します。 解法のアプローチ この問題は動的計画法(DP)を用いて効率的に解くことができます。メモ化により計算量を抑えつつ、DPテーブ

  17. C++でゴーストゲームの先手プレイヤーが勝利できるかを判定するプログラム

    単語のリストが与えられているとします。ここで、2人のプレイヤーが参加する「ゴーストゲーム」について考えてみましょう。このゲームでは、プレイヤーが交互に文字列へ文字を追加していきます。作成中の文字列は、常にリスト内のいずれかの単語の有効な接頭辞(プレフィックス)でなければならず、リスト内の単語を完成させてしまったプレイヤーが負けとなります。両者のプレイヤーが最適な戦略を取る場合、先手のプレイヤーが勝つことができるかどうかを判定する必要があります。例えば、入力が words = [manage, manager, min] の場合、出力は True になります。以下のように進めることができるためで

  18. C++で重み付きグラフにおける真のクエリ数をカウントするプログラム

    問題の概要 無向グラフの辺リストを考えます。各辺は [u, v, w] という形式で与えられ、u と v はそれぞれ始点・終点の頂点、w はその辺の重みを表します。さらに、同じ形式 [u, v, w] のクエリリストも与えられます。各クエリは「頂点 u から v へ、パス上のすべての辺の重みが w 以下であるような経路は存在するか?」という問いを意味します。このとき、真(true)となるクエリの個数を求めてください。 たとえば、入力が以下の場合を考えてみましょう。 edges = [[0, 1, 6], [1, 2, 7], [2, 3, 8], [0, 3, 5]] queries = [[

  19. C++ですべてのバナーを吊るすのに必要な最小ピン数を求めるプログラム

    区間 [start, end] のリストが与えられ、これは掛けたいバナーの開始位置と終了位置を表しているとします。バナーを掛けるには最低でも1本のピンが必要で、1本のピンで複数のバナーを同時に掛けることも可能です。ここでは、すべてのバナーを掛けるために必要な最小限のピン数を求めます。問題の例たとえば、入力が intervals = [[2, 5], [5, 6], [8, 10], [10, 13]] の場合、出力は 2 になります。位置 5 と 10 の2か所にピンを打つことで、すべてのバナーを掛けられるためです。解法の考え方この問題は貪欲法を使うことで効率的に解けます。各区間を「終了位置の

  20. C++で数字文字列から生成可能なすべての有効なIPアドレスを復元する方法

    問題概要0〜9の数字だけで構成された文字列が与えられたとします。この文字列を復元し、考えられるすべての有効なIPアドレスの組み合わせを求めることを目指します。ここで「有効なIPアドレス」とは、0から255までの範囲に収まる整数がちょうど4つ並び、それぞれが単一のドット(.)で区切られている形式を指します。例として、入力が ip = 25525511136 の場合、出力は [255.255.11.136, 255.255.111.36] のようになります。解法のアプローチこの問題は、バックトラッキング(深さ優先探索)を用いることで効率的に解けます。以下の手順で実装を進めます。1. convert

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:234/300  20-コンピューター/Page Goto:1 228 229 230 231 232 233 234 235 236 237 238 239 240