- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- DFS
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- DP
- ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋ฐฑ์ค
- golang
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ด๋ถํ์
- ์ฌ๊ท
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ์นด์นด์ค2021
- ์น๋ฆฐ์ด
- ๋ค์ต์คํธ๋ผ
- Python
- Union-Find
- js
- ์นด์นด์ค ์ฝํ
- LCs
- ์ํฐ๋
- C++
- go
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- ์์ฝ๋
- ์๊ณ ๋ฆฌ์ฆ
- ํธ๋ฆฌ
- nestjs
- BFS
- ๋นํธ๋งต
- ๋นํธ๋ง์คํน
- Today
- Total
Hello Ocean! ๐ผ
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋]์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ์ ๋ต LIS ๋ณธ๋ฌธ
[๋ฌธ์ ]
์ฃผ์ด์ง ์์ด์ ๋ํด ์ต๋ ์ฆ๊ฐ ๋ถ๋ถ ์์ด ๊ตฌํ๊ธฐ.
์ต๋ ์ฆ๊ฐ ๋ถ๋ถ์์ด์ด๋?
- ์์๋ค์ด ์์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด ์ค์ ๊ฐ์ฅ ๊ธด ๊ฒ
[ํ์ด]
๋์ ํ์ด
n ํฌ๊ธฐ์ ์์ด์ ๋ํด n*n ํฌ๊ธฐ์ ์ด์ฐจ์ cache๋ฅผ ์ฌ์ฉํ์.
์ด ๋ฌธ์ ์ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ์ ์ผ๋ก maxCount๋ฅผ ์ cache๊ฐ์ ๊ณ์ฐํด์ ์ ์ฅํ ๋ ๋ง๋ค ๊ฐฑ์ ์์ผ์ผ ํ๋ค.
๊ทธ ์ด์ ๋, maxCount๊ฐ ์ฒซ ๋ฒ์งธ ์์๋ถํฐ ์์ํ ๊ฒฝ์ฐ์์ ๋์ค์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ex) 5,3,4์ ๊ฒฝ์ฐ ์ต๋์ฆ๊ฐ๋ถ๋ถ์์ด์ 3,4๊ฐ ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ cache ๋ด๋ถ์ ๊ฐ์ค์์ ์ต๋๊ฐ์ ์ฐพ์์ผํ๋๋ฐ ์ด ๊ณผ์ ์ ๊ณ์ฐํ ๋ ํ๋ฒ์ ํ๊ธฐ ์ํด์ maxCount๋ฅผ ์ฌ์ฉํ๋ค.
(๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํด๊ฐ ๋ ์ ๋ ๊ฒ์ด๋ค.)
์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์ข ๋ ๋ณต์กํ ์์๋ฅผ ์ ์ฉํด๋ณด์.
1,3,2,4,6,8 ์ ์์ด์ ๋ํ cache๋ฅผ ๊ตฌํด๋ณด์
๊ท์น์ ์ ์ฉํด์ cache๋ฅผ ๋ชจ๋ ์ฑ์ฐ๋ฉด ์๋์ ๊ฐ๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์, cache ๋ด์ max๊ฐ์ +1์ ํด์ค์ผ ์ต์ข output์ด ๋๋ค๋ ๊ฒ์ด๋ค.
์๋ํ๋ฉด cache์์๋ ์ต๋๋ถ๋ถ์ฆ๊ฐ์์ด์ ๊ฐ์ ์ ์ฅํ ๋ '์์์ '์ ์์๋ ์ธ์ง ์๊ณ ์ ์ฅํ๋ค.
ex) 2๋ฒ์งธ ์์ ~ 5๋ฒ์งธ ์์ ์ฌ์ด์ ์ต๋ ๋ถ๋ถ์ฆ๊ฐ ์์ด์ ๊ธธ์ด๋
2๋ฒ์งธ ์์ ~ 4๋ฒ์งธ ์์ ์ฌ์ด์ ์ต๋ ๋ถ๋ถ์ฆ๊ฐ ์์ด์ ๊ธธ์ด + 4๋ฒ์งธ ์์ ~ 5๋ฒ์งธ ์์ ์ฌ์ด์ ์ต๋ ๋ถ๋ถ์ฆ๊ฐ ์์ด์ ๊ธธ์ด ๊ฐ ๋๋ค.
์ด ๊ณผ์ ์์ 4๋ฒ์งธ ์์๊ฐ ๋ ๋ฒ ์ธ์ด์ง๊ธฐ ๋๋ฌธ์, cache์ ๊ฐ์ ์ ์ฅํ ๋ ์์์ง์ ์ ์์์ ๊ฐ์๋ฅผ ์ธ์ง ์๊ณ ์ ์ฅํ์๋ค.
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int n;
int arr[101];
int cache[101][101] = { 0, };
scanf_s("%d", &n);
for (int i = 0;i < n;i++)
scanf_s("%d", &arr[i]);
int maxCount=0;
for (int i = n - 2;i >= 0;i--) {
if (arr[i + 1] > arr[i])
cache[i][i + 1] = 1;
for (int j = 2;j < n - i;j++) {
if (arr[i + j] > arr[i]) {
cache[i][i + j] = cache[i][i + j - 1] + cache[i + j-1][i+j];
if (cache[i][i + j] > maxCount)
maxCount = cache[i][i + j];
}
}
}
printf("result = %d\n", maxCount+1);
/*
printf("--cache--\n");
for (int i = 0;i < n;i++) {
for (int j = 0;j < n;j++) {
printf("%d ", cache[i][j]);
}
printf("\n");
}
*/
}
cache์ ๊ด๋ จ๋ for๋ฌธ์์
i๋ฅผ n-2๋ถํฐ ์์ํ๋ ์ด์ ๋, ๋งจ ๋ง์ง๋ง์ค์๋ ์ฑ์ธ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
j๋ฅผ 2๋ถํฐ ์์ํ๋ ์ด์ ๋, j=1์ผ ๋ (๋ฐ๋ก ๋ค์์ซ์์ ๊ตฌํ ๋)๋ฅผ for๋ฌธ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ if๋ฌธ์์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ต ํ์ด
์ฑ ์ ๊ธฐ์ฌ๋ ํ์ด๋, ์ฌ๊ท์ ์ผ์ฐจ์ cache๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด์๋ค.
LIS์ ์์ฉ๋ฌธ์ ์ธ JLIS๋ฅผ ํ๊ธฐ ์ํด์, ์ฌ๊ท๋ก ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค.
์ฐ์ , ์ฝ๋๋ ์ด๋ฌํ๋ค.
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
int cache[101], arr[100];
int lis_recursive(int start) {
int& ret = cache[start + 1];
if (ret != -1) return ret;
ret = 1;
for (int next = start + 1; next < n;next++)
if (start == -1 || arr[start] < arr[next])
ret = max(ret, lis_recursive(next) + 1);
return ret;
}
int main() {
fill(cache, cache + 101, -1);
scanf_s("%d", &n);
for (int i = 0;i < n;i++)
scanf_s("%d", &arr[i]);
printf("result = %d\n", lis_recursive(-1)-1);
}
cache[i]์๋ i+1๋ฒ์งธ ์นธ~๋ ์นธ๊น์ง์ ์ต๋ LIS๊ธธ์ด๋ฅผ ์ ์ฅํ๋ค.
ํน์ดํ ์ ์, main์์ ํจ์๋ฅผ ํธ์ถ ํ ๋ start๋ฅผ 0์ผ๋ก ์์ํ๋ ๊ฒ์ด ์๋๋ผ, -1๋ก ์์ํ๋ ์ ์ด๋ค.
์ฃผ์ด์ง ์์ด์ -1๋ฒ ์นธ์ -๋ฌดํ๋๋ผ๊ณ ๊ฐ์ ํ๊ณ ํ์ดํ๋ ๋ฐฉ์์ด๋ค. (๋ชจ๋ ์์ ์์น๋ฅผ ์๋์ผ๋ก ์๋ํ๊ธฐ ์ํด ์ ์ฉ)
๊ทธ๋์ return ๋ ret๊ฐ์ -1๋ฒ์นธ ๊น์ง ์ธ์ด์ง ๊ฒ์ด๋ฏ๋ก 1์ ๋นผ์ค์ผ ์ต์ข LIS์ ๊ธธ์ด๊ฐ ๋๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ๋ฐฑ์ค #1461 ๋์๊ด (1) | 2020.04.23 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ๋ฐฑ์ค #9251 LCS (0) | 2020.04.19 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ์๊ณ ์คํ #TRIANGLEPATH (0) | 2020.04.13 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ๋ฐฑ์ค #1417 ๊ตญํ์์ (0) | 2020.04.11 |
[C++] ๋ฐฐ์ด ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ (0) | 2020.04.11 |