87 lines
3.1 KiB
Markdown
87 lines
3.1 KiB
Markdown
#алгоритмы
|
||
|
||
> Метод динамического программирования начинает с малых задач, а затем переходит к большой задаче. Вы решаете подзадачи, которые помогут в решении большой задачи.
|
||
|
||
|
||
- Динамическое программирование применяется для оптимизации какой-либо характеристики при заданных ограничениях. В задаче о рюкзаке требуется максимизировать стоимость отобранных предметов с ограничениями по емкости рюкзака.
|
||
- Динамическое программирование работает только в том случае, если каждая подзадача автономна, то есть не зависит от других подзадач.
|
||
|
||
Общий вид решения
|
||
- в каждом решении из области динамического программирования строится таблица
|
||
- значения ячеек таблицы обычно соответствуют оптимизируемой характеристике
|
||
- каждая ячейка представляет подзадачу,
|
||
|
||
## Самая длинная общая подстрока
|
||
|
||
```javascript
|
||
const createMatrix = (row, col) => {
|
||
const arr = Array(row).fill(Array(col).fill(0));
|
||
return JSON.parse(JSON.stringify(arr));
|
||
}
|
||
|
||
const maxCommonSubstring = (str1, str2) => {
|
||
const matrix = createMatrix(str1.length, str2.length);
|
||
|
||
let maxSize = 0;
|
||
let endIndex = 0;
|
||
|
||
for (let i = 0; i < str1.length; i++) {
|
||
for (let j = 0; j < str2.length; j++) {
|
||
if (str1[i] !== str2[j]) {
|
||
continue
|
||
}
|
||
|
||
matrix[i][j] = (i && j) > 0 ? matrix[i - 1][j - 1] + 1 : 1;
|
||
|
||
if (matrix[i][j] >= maxSize) {
|
||
maxSize = matrix[i][j];
|
||
endIndex = j + 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
return str1.slice(endIndex - maxSize, endIndex);
|
||
}
|
||
|
||
|
||
maxCommonSubstring('fish', 'hish'); // 'ish'
|
||
maxCommonSubstring('fish', 'fista'); // 'fis'
|
||
maxCommonSubstring('fish', 'fista'); // 'is'
|
||
```
|
||
|
||
|
||
## Самая длинная общая подпоследовательность
|
||
|
||
```javascript
|
||
const createMatrix = (row, col) => {
|
||
const arr = Array(row).fill(Array(col).fill(0));
|
||
return JSON.parse(JSON.stringify(arr));
|
||
}
|
||
|
||
const maxCommonSubsequence = (str1, str2) => {
|
||
const matrix = createMatrix(str1.length, str2.length);
|
||
|
||
for (let i = 0; i < str1.length; i++) {
|
||
for (let j = 0; j < str2.length; j++) {
|
||
if (str1[i] === str2[j]) {
|
||
matrix[i][j] = (i && j) > 0 ? matrix[i - 1][j - 1] + 1 : 1;
|
||
} else {
|
||
const left = i > 0 ? matrix[i - 1][j] : 0;
|
||
const up = j > 0 ? matrix[i][j - 1] : 0
|
||
|
||
matrix[i][j] = Math.max(left, up);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
return matrix[str1.length - 1][str2.length - 1]
|
||
}
|
||
|
||
maxCommonSubsequence('fort', 'fosh'); // 2
|
||
maxCommonSubsequence('fish', 'fosh'); // 3
|
||
```
|
||
|
||
|
||
Источники:
|
||
- [[Адитья Бхаргава - Грокаем Алгоритмы]] |