樹形動的計画法の典型アルゴリズムと問題解説
二分リンゴの木 (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 投稿