樹形動的計画法の典型アルゴリズムと問題解説

二分リンゴの木 (Binary Apple Tree) この問題は「樹上ナップサック」の典型例です。木の枝に重みが付いており、保持する枝の数を制限したときの最大価値を求めます。 状態定義: dp[u][j] : 頂点 u を根とする部分木において、j 本の枝を残したときの最大価値。 遷移式: dp[u][j] = max(dp[u][j], dp[u][j - k - 1] + dp[v][k] + edge_weight) ここで v は u の子、k は子 ...

10月20日 15:44 投稿

MATLABで実装するDTW時間系列対齊ツールキット:分類・クラスタリングのデモと複数データセットによる検証

概要:実用的なDTWライブラリの設計と応用 本ツールキットは、MATLAB環境向けに最適化された動的時系列規格化(DTW)実装であり、dtw.mとdist_dtw.mをコアモジュールとして、柔軟なシーケンス長設定、制約ウィンドウ(例: warp_window_0.135.mat)、距離測度の選択をサポートしています。内蔵の実験スクリプト群により、時間系列分類(DTW vs ユークリッド距離)、K-means ...

10月7日 21:43 投稿

AtCoder ABC369 のアルゴリズム解説

A. 369 整数 $C$ が存在して $A, B, C$ が等差数列となる条件は、$A+B$ が偶数であることです($C = (A+B)/2$ が整数であることと同値)。特別な場合として、$A=B$ であれば数列の長さは1となるため、答えは1です。それ以外の場合、$A+B$ が偶数ならば $A$ と $B$ の間に整数が1つ、$A$ と $B$ の外側に整数が1つずつ存在するため、選択肢は3つになります。奇数の場合は $A ...

8月22日 09:01 投稿

Javaリフレクション:クラスの動的プロパティアクセスと変更

Javaのリフレクション機能は、実行時にプログラム自身の構造や動作を検査・変更できる強力な仕組みです。この機能を利用することで、クラスのフィールド、メソッド、コンストラクタなどを動的に操作することが可能です。 基本的なクラス情報の取得 リフレクションの主要なクラスは java.lang.reflect パッケージに配置されています。 package com.example.demo; public ...

8月16日 18:43 投稿

ICPC南京2025 区域赛 CFGIJ 解法まとめ

C. キャンディの均等配分 問題の本質は「奇数個のキャンディは必ず偶数を生むため分割不可」という観察にある。したがって入力が偶数であれば単純に半分に分ければよく、奇数なら即座に不可と判定する。 void judge() { long long N; std::cin >> N; if (N & 1) { std::cout

7月18日 21:14 投稿

LeetCodeにおける動的計画法:最長増加部分列と最長重複部分配列の解説

最長増加部分列 (LeetCode 300) 整数配列が与えられた場合、その中に含まれる最長の狭義増加部分列(Strictly Increasing Subsequence)の長さを見つけます。部分列とは、配列から要素をいくつか(0個でもよい)削除し、残りの要素の順序を変更しないで得られる配列のことを指します。 この問題は動的計画法(DP)を用いて解くのが一般的です。2層のループ構造が必要と ...

7月11日 22:38 投稿

競技プログラミングで活用できるアルゴリズムのテクニック

高速乗算の実装 以下の実装は誤差が発生せず高速に動作します。 long long multiply(long long x, long long y, long long mod) { long long c = static_cast<long long>(static_cast<long double>(x) * y / mod + 0.5); c = x * y - c * mod; if (c < 0) c += mod; if (c >= mod) c -= mod; return c; } 貪欲法の応用 線分関 ...

6月30日 00:09 投稿

アルゴリズム実践トレーニングカリキュラム

配列操作編 二分探索と要素削除 二分探索:境界条件の2つの実装方法に注意。rightの定義、if条件と境界更新ロジックが重要。 左閉右閉左閉右開 rightの定義len(arr) - 1len(arr) ループ条件while left <= right:while left < right: 境界更新right = mid - 1right = mid class Solution: def binary_search(self, arr: List[int], target: int) -> int: ...

6月26日 18:36 投稿

Codeforces Round 999 合併部門における競技プログラミング問題の解説

A - 数列の並べ替えとスコア最適化 長さ n の整数列 a が与えられる。初期値が 0 の変数 s に対して、a の要素を順に加算する。s が偶数になった場合、ポイントを 1 加算した上で s を 2 で割った余り(つまり s % 2)に更新する。この操作を繰り返す中で、得られるポイントの合計を最大化するために、a の要素をどのように並び替えるべきか。 重要な観察として、奇数の個 ...

6月22日 18:23 投稿

第14回 藍橋杯 C/C++ Bグループ 省大会 競技課題の解説と実装

1. 日付統計 (Date Statistics) 8桁の数値が並んだ100個のデータから、2023年に存在する有効な日付(YYYYMMDD形式)がいくつ作れるかをカウントする問題です。部分列として抽出する必要があるため、全探索や動的計画法でアプローチします。このコードは計算済みの結果を出力する例です。 #include <iostream> int main() { // 探索アルゴリズムによって算出され ...

6月9日 22:20 投稿