競技プログラミングにおける代表的アルゴリズムテンプレート集
高精度計算
トライ木を用いたA+B
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct TrieNode {
int children[26];
int value;
} nodes[1000];
char buffer[100];
int nodeCount = 0, totalNodes = 0, resultSum = 0;
bool negativeFlag;
void insertNumber() {
int cur ...
7月3日 20:44 投稿
動的計画法入門:フィボナッチ数列モデル
動的計画法(DP)とは
動的計画法(Dynamic Programming, DP)は、問題をより小さな部分問題に分割し、その結果を再利用することで効率的に解く手法です。特に「重複部分問題」と「最適部分構造」を持つ問題に有効です。
DPの一般的な手順
状態の定義:DPテーブル(dp配列)の各インデックスが何を表すかを決める。これがすべての基盤となる。
状態遷移式:dp[i]を求める ...
7月2日 22:04 投稿
ABC379 問題解説:C・D・E・F
C問題:石の山の配置
石を後方にしか移動できないという制約下で、目標の配置が可能かどうかを判定し、最小移動回数を求める問題です。
条件を満たす配置は一意に定まるため、以下の3点をチェックします。
石の総数がnと一致しない場合は不可能。
最初の山の位置が1でなければ不可能。
途中の位置で、それまでの石の合計数が必要数に満たない場合は不可能。
解 ...
6月22日 21:01 投稿
CF1228E Another Filling the Grid の解法
すべての行に少なくとも 1 つの 1 を配置する必要があるため、行ごとに処理し、その行にいくつかの 1 を追加することを考えます。現在の状態を表すために、dp[i][j] を「最初の i 行を埋めた時点で、1 がすでに存在する列が j 列ある場合の埋め方の総数」と定義します。遷移では、現在の行で新たに 1 を追加する位置の数を k とし、残りの位置には任意の値を入れます。
\[ ...
5月22日 16:27 投稿