๋ถ๋ถ ์์ด์ ์ด๋ ์ ๋ ๋ง์คํฐํ๋ค๊ณ ์๊ฐํ๋๋ฐ ๋ ๋ค์ ๋งํ ๋ฌธ์ . ๊ทธ๋ง ๋งํ๊ณ ์ถ๋ค.
์ผ๋จ ๋ฒ์๋ ์ ์งํ๊ฒ ์ด๊ธฐ ๋๋ฌธ์, ์ ํ์ ์ธ DP
์์ ์ ์ ์๋ค. ๋ถ๋ถ ์์ด ๋ฌธ์ ๋ LIS
์ ๋ ์ ์ธํ๋ฉด ๋ก ํ์ดํ๋ ๊ฒ์ด ๊ฑฐ์ ์ ์์ด๋ผ.. ๋ค๋ง ์ฌ์ ํ ์ต์ํ์ง ์์์ง ๋ง์ WA
๋ฅผ ๋ด๊ณ ๋ง์๋ค. ์ฒ์ ์๋ชป ์ ๊ทผํ ํ์ด๋ถํฐ ๋ณด์.
์ฒ์์ ์ ๊ทผํ๋ ๋ฐฉ์์ map
์ ํ์ฉํด์ ๊ตฌํด๋ณด๋ ค ํ์ผ๋ ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ์ด์์ ํ์ด๊ฐ ๋๊ณ ๋ง์๋ค. ๊ฐ๋ฅํ ๋ชจ๋ sum
์ ๊ตฌํ๊ณ , ๋ ์ด์ ์
๋ฐ์ดํธ๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณตํด์ ๋ฃจํ๋ฅผ ๋๋ ๋ฐฉ์์ธ๋ฐ, ๊ฐ๋ฅํ ๋ชจ๋ sum
์ ์์ฒญ ๋ง๊ธฐ ๋๋ฌธ์ ์ ์๋น์ด์ DP
์ ๊ทผ์ด ์๋๋ค. DP
๋ ์ํ ๊ณต๊ฐ์ ์ค์ด๋ ๊ฒ์ด ํต์ฌ์ธ๋ฐ, ํฉ์ ๊ธฐ์ค์ผ๋ก ์ค์ด๋ ๊ฒ์ ์ํ๊ณต๊ฐ์ ์ ํ ์ค์ด์ง ๋ชปํ๋ค. (๊ฒฐ๋ก ์ ์ธ ์ด์ผ๊ธฐ์ด์ง๋ง)
์ฒ์์ ์๋ชป ์๊ฐํ๋ ์ด์ ๊ฐ ์ด๋ผ๋ ์กฐ๊ฑด ๋๋ฌธ์ด์๋ค. ์ ์ฒด i ๊ฐ์๊ฐ 1000๊ฐ๊น์ง๋ผ์ ์๊ฐ๋ณด๋ค sum
๊ฒฐ๊ณผ์ ์ํ๊ณต๊ฐ์ด ํฌ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ผ๋(์ต๋๊ฐ์ด ๋ฐฑ๋ง์ด๋ค), ๊ฒฐ๊ณผ์ ์ผ๋ก๋ TLE
.
๊ทธ๋ ๋ค๋ฉด ์ํ ๊ณต๊ฐ์ ์ด๋ป๊ฒ ์ค์ผ ์ ์์๊น? ๊ทธ๊ฒ์ LIS
์ ํ์ด์์ ๋ดค๋ ๊ฒ์ฒ๋ผ, index ๊ธฐ์ค์ผ๋ก ์ค์ผ ์ ์๋ค. ์๋ ๋ฒ์งธ์์ ๊ฐ์ง ์ ์๋ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ต๋๊ฐ์ ๊ธฐ๋กํด๋๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฉด, ๊ฐ ๋๋ ์กฐ๊ฑด์์, ๋ก ์
๋ฐ์ดํธ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ํด๋น ์์น์์์ ๊ฐ์ ๊ณ์ํด์ ์บ์ฑํด์ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ์ด๋ฉฐ, ๋ฎ์ index๋ถํฐ ๊ธฐ๋กํ๋ฉด ๋น ์ง์์ด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฒดํฌํ ์ ์๋ค.
์ต์ข ์ ์ธ ์ ๋ต์ ์ค์ ์ ์ผ ํฐ ๋ ์์ด๋ค.
#include <bits/stdc++.h>using namespace std;typedef long long ll;int main() {int N; scanf("%d", &N);vector<ll> A(N+1);vector<ll> DP(N+1);for(int i = 1; i <= N; ++i) scanf("%lld", &A[i]);// DP[i] -> i์์์ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ต๋ ํฉ// N^2 ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ ์ ์ฑ์ ๋๊ฐ๋ค.DP[1] = A[1]; // 1: 1๊น์ง์ ์ต๋ ํฉll maxval; maxval = A[1];// ์ํ ์ ์ด ์์ ์๋์ ๊ฐ์ด ์ ์ํ ์ ์๋ค.// DP[i] = max(DP[i], DP[j] + A[i]) (Only A[j] < A[i] ์ธ ๊ฒฝ์ฐ์๋ง)for(int i = 2; i <= N; ++i) {for(int j = 0; j <= i; ++j) {if(A[j] < A[i]) {DP[i] = max(DP[i], DP[j] + A[i]);}}if (DP[i] > maxval) maxval = DP[i];}printf("%lld\n", maxval);return 0;}