문제 링크 : https://www.acmicpc.net/problem/8311
문제 풀이
문제를 읽으면 상태가 (1~i 까지 중에서, 부분 배열의 마지막 숫자) 와 같은 식으로 나오기 때문에 DP를 떠올리게 된다. 하지만, $A_i$ 는 단지 수 하나이기 때문에 dp[i-1] 에서 dp[i] 로 넘어갈때 dp[i][$A_i$] 만 바뀌게 되고, 따라서 2차원 DP를 할 필요 없이 그냥 부분 배열의 마지막 숫자만 들고 있으면 된다.
DP[$A_i$]에 업데이트 할 값은 $ \sum_{j=1,j\neq A_i}^{N} DP[j] $ 이기 때문에 DP의 모든 칸의 합을 변수로 들고 있으면서 DP[$A_i$] 값만 빼주고 업데이트 하면 된다. 시간 복잡도는 $O(N)$
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef double dl;
typedef pair<dl,dl> pdi;
typedef pair<ll,ll> pii;
typedef pair<ll,pii> piii;
#define ff first
#define ss second
#define eb emplace_back
#define ep emplace
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define compress(v) sort(all(v)), v.erase(unique(all(v)), v.end())
#define IDX(v, x) lower_bound(all(v), x) - v.begin()
//cout<<fixed;
//cout.precision(12);
struct poi{
ll val,xx,yy;
};
vector<ll> x;
ll n,m;
ll mod=1000000007;
string s;
string t;
ll arr[1010101];
vector<ll> v[1010101];
ll dp[1010101];
ll all=1;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
ll i,j,k,a,b,c,d,e,f;
cin>>n;
for(i=1;i<=n;i++){
cin>>a;
ll x=all-dp[a];
all+=x;
dp[a]+=x;
all%=mod;
}
all--;
all+=mod;
cout<<all%mod;
}
|
cs |
'코딩 > 백준 문제 풀이' 카테고리의 다른 글
BOJ 3682 - 동치 증명 (0) | 2022.08.26 |
---|---|
BOJ 7117 - Sevens, twos and zeros (0) | 2022.08.20 |
BOJ 12430 - 생존자 (0) | 2022.08.16 |
BOJ 17670 - 난 (0) | 2022.08.14 |
BOJ 5542 - JOI 국가의 행사 (0) | 2022.08.13 |