回文部分文字列と回文部分列の動的計画法による解法
回文部分文字列のカウント
この問題の難しさは、DP配列の定義と漸化式の構築にあります。直接dp[i]を[0,i]の部分文字列に含まれる回文の数と定義すると、漸化式を見つけることができません。回文の性質を利用して、次のような漸化式を構築できます:[i,j]が回文かどうかを判断するために、s[i] == s[j]の場合は[i+1,j-1]が回文かどうかを確認するだけで済みます。s[i] != s ...
6月1日 11:09 投稿
C言語におけるマージソートの実装と最適化
マージソートは分割統治法に基づく効率的なソートアルゴリズムです。この記事では、C言語での実装方法とパフォーマンス向上のためのテクニックを解説します。
マージソートの基本概念
マージソートは配列を2つの部分に分割し、それぞれをソートした後、結果をマージするアルゴリズムです。以下の特徴があります:
時間計算量:O(n log n)
空間計算量:O(n)
安定ソート
...
5月31日 21:41 投稿
C言語における配列操作とアルゴリズムの基礎実装
C言語における配列のメモリレイアウトの理解から、ソートアルゴリズム、進数変換、行列演算といった実用的なアルゴリズムの実装まで、いくつかの例を通して解説します。
1. 配列のメモリレイアウトとアドレス
配列はメモリ上で連続した領域を占有します。以下の例では、1次元配列および2次元配列のアドレスと要素の配置を確認できます。
#include <stdio.h>
void i ...
5月31日 02:09 投稿
C++における二分探索木の実装と操作
二分探索木とは
二分探索木(Binary Search Tree: BST)は、以下の条件を満たす二分木構造です:
左部分木に含まれるノードの値は、常に親ノードの値より小さい
右部分木に含まれるノードの値は、常に親ノードの値より大きい
左右の部分木もまた二分探索木を満たす
基本操作
探索(Search)
探索操作は以下のように行われます:
ルートノードから比較を開始します
探索 ...
5月30日 20:39 投稿
Experiment 3
1
#include<stdio.h>
char evaluate_grade(int point);
int main() {
int input;
char result;
while (scanf("%d", &input) != EOF) {
result = evaluate_grade(input);
printf("点数:%d ", input);
printf("評価:%c\n", result);
}
return 0;
}
char evaluate_grade(int point) ...
5月30日 15:49 投稿
第4回藍橋杯省選C++グループ問題完全解答
ガウスの日記
出典:第4回藍橋杯省選C++A/Bグループ
アルゴリズムタグ:シミュレーション
問題説明:
大数学者ガウスには日記をつけるという良い習慣がありました。彼の日記は特別な点があり、年月日を書く代わりに整数を使用していました。例えば、4210という数字です。
後になって、その整数が日付を表していることが分かりました。それは、その日がガウスの誕生日から何 ...
5月30日 11:40 投稿
競技プログラミング問題集 SMU Spring 2023
A. 重複要素の削除
与えられた数列から重複要素を削除し、最初に出現した要素のみを保持するアルゴリズム。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
vector<int> removeDuplicates(const vector<int>& nums) {
unordered_map<int, int> countMap;
vector<int> result ...
5月29日 14:24 投稿
C言語における単方向連結リストの仕組みと実装方法
連結リストの基本概念とノード定義配列などのシーケンシャルなデータ構造では、要素の挿入や削除に伴うデータの移動コストが高くなる。この問題を解決するため、各要素をポインタで連結する連鎖構造(単方向連結リスト)が用いられる。単方向連結リストには以下の特徴がある。論理的に隣接する要素が物理的なメモリ上でも隣接している必要がない。ランダムアクセスが不可能 ...
5月29日 08:29 投稿
木の連鎖分解(ヘビーライト分解)のまとめ
木の連鎖分解(ヘビーライト分解)のまとめ
基本概念
基本的な考え方
実装手順
ステップ1: 重い子、重い連鎖
ステップ2: dfn順序
ステップ3: 時間計算量の分析
コード実装
重い子の検出
連鎖分解
各種操作
LCAの計算:
パス更新:
パスクエリ:
推奨問題
基本概念
基本的な考え方
\qquad 木の連鎖分解、名前の通り、木データ構造に適用され ...
5月28日 14:42 投稿
双指针アルゴリズムによる合計問題の解法
2つの数の合計が特定の値になる場合
配列がソートされている場合、双指針法を用いて効率的に解決できます。左端と右端から開始し、合計値を比較してポインタを移動します。
public class SumSolution {
public static int[] findTwoSum(int[] arr, int target) {
int start = 0;
int end = arr.length - 1;
while (start < end) {
...
5月28日 13:34 投稿