探索と最適化アルゴリズムによる競技プログラミング問題の解法
マトリックス操作と深さ優先探索(DFS)
最初の問題は、与えられたバイナリ行列を行の反転と列の置換によって目標の行列に一致させられるかを判定するものです。行の反転は同一の行に対して2回行うと無効になるため、各行に対する操作は「行う」か「行わないか」の二択です。
まず、各行の要素の合計値を見て、反転することが確定している行を処理します。特定の行において ...
8月15日 00:33 投稿
7日間でツリー構造アルゴリズムをマスターする:基礎からLeetCode実践まで
ツリー構造のアルゴリズムは、程序员面试和算法学习中的核心内容,掌握树的遍历、深度计算、路径查找等技能对解决复杂问题至关重要。本文将通过7天系统学习计划,帮助你从基础到进阶,全面掌握树结构算法,并结合LeetCode实战案例巩固提升。ツリー構造アルゴリズムを学ぶ意義ツリー構造は、データベースインデックス、ファイルシステム、人工知能などの分野广泛应用されて ...
7月24日 01:33 投稿
アカウントのメールアドレスを統合するUnion-Findアプローチ
問題概要
複数のアカウント情報が「名前, メール1, メール2, …」という形式で与えられる。同一人物のアカウントは少なくとも1つのメールアドレスが共通しているため、それらを1つにまとめて返却せよ。
Union-Findを用いた解法
「共通のメールアドレスを持つアカウントは同一人物」という条件は、「同一要素を含む集合をすべて結合」というUnion-Findの典型的な利用シーン ...
7月16日 21:36 投稿
木の直径を求める2つの主要アプローチ
木の直径(Tree Diameter)とは、木構造グラフにおいて最も離れた2つのノード間の距離を指します。この計算には、主に深さ優先探索(DFS)を2回行う方法と、動的計画法(DP)を用いる方法の2つが広く知られています。本記事では、それぞれのアルゴリズムの原理と実装手法について解説します。
DFSによる2回の探索アプローチ
この手法は非常に直感的で、計算量も効率的です ...
7月14日 23:27 投稿
AtCoder Beginner Contest 333 スolved 解説
概要
AtCoder Beginner Contest 333 の Implement 問題を解説します。難易度は A-D が初心者〜中級者向け、E はGreedy + スタック操作の基礎知识点が必要です。
A - Three Threes
入力された整数 \(n\) を \(n\) 回連続して出力する問題です。
制約が \(1 \le n \le 9\) と非常に小さいため、ループで単に出力すればOKです。
#include <iostream>
using namespac ...
6月29日 20:56 投稿
AtCoder Beginner Contest 378
A - ペアリング
問題文
4つの数が与えられる。各ステップで同じ値の2つの数字を選んで削除する。この操作を最大何回行えるかを求める。
解法
シミュレーションを行う。
コード
コードを表示#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int a, b, c, d;
...
6月27日 01:13 投稿
再帰関数の設計手法
1. はじめに
再帰は、関数型言語のみならず、あらゆるプログラミングパラダイムにおいて極めて重要な概念である。本稿では、数学的帰納法との関連性を踏まえながら、再帰関数の設計手法について体系的解説していく。
2. 再帰と数学的帰納法
2.1 数学的帰納法の原理
数学的帰納法は、自然数に関する命題を証明するための手法である。その原理は以下の2つのステップから ...
6月22日 22:05 投稿
グラフ理論のアルゴリズム実装ノート
1. 隣接行列を用いたDFS(再帰実装)
class GraphStructure {
public:
GraphStructure(int nodes);
void addConnection(int src, int dst);
void traverseDFS(int startNode);
private:
int nodeCount;
vector<vector<int>> adjacencyMatrix;
vector<bool> visitedFlags;
void dfsRecursive(int current);
};
GraphStruc ...
6月15日 20:13 投稿
01迷路の探索と到達可能セル数の計算
問題概要
n×nのサイズの迷路があり、各セルには0または1が書かれています。現在位置が0の場合、上下左右の隣接する4つのセルのうち1のセルに移動できます。同様に、現在位置が1の場合は、隣接する0のセルに移動可能です。この迷路に対して、指定された開始位置から移動可能なセルの総数(開始位置を含む)を求める問題です。
入力形式
1行目:正整数 n, m(迷路のサイズと ...
6月2日 22:01 投稿
文字列の回転・k個のソート済みリストのマージ・スキー問題の解法
109: 文字列の回転
問題リンク: 文字列回転問題
解法:
class StringRotator {
public:
bool checkRotation(string str1, string str2) {
int len = str1.length();
if (len != str2.length()) return false;
for (int i = 0; i < len; i++) {
if (str1[i] == str2[0]) {
int idx1 = i, idx2 = 0;
...
5月22日 17:57 投稿