본문 바로가기

PS/boj

백준 1994 등차수열 (C++)

 

https://www.acmicpc.net/problem/1994

 

1994번: 등차수열

N개의 음 아닌 정수들이 있다. 이들 중 몇 개의 정수를 선택하여 나열하면 등차수열을 만들 수 있다. 예를 들어 4, 3, 1, 5, 7이 있을 때 1, 3, 5, 7을 선택하여 나열하면 등차수열이 된다. 이와 같이

www.acmicpc.net

map을 이용한 dp문제였습니다.

처음에 키값을 pair형태로 사용하려해서 메모리초과가 계속 나 애를 많이 먹었습니다. 앞으로는 map에 들어가는 데이터가 많을때는 키값을 pair로 두기보다 배열형태로 pair 값 하나를 대체하는게 낫다는걸 깨달았습니다.  수열과 똑같은 크기의 배열을 만들고 각 index마다 공차를 키값으로 바텀업 dp를 하면 됩니다.

#include<stdio.h>
#include<vector>
#include<math.h>
#include<algorithm>
#include<bitset>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<functional>
using namespace std;
void fast_io() {
  cin.tie(0)->sync_with_stdio(0);
}
map<int,int> m[2003];
int main(){
    fast_io();
    int N;
    cin>>N;
    vector<int> vec(N,0LL);
    for(auto &i : vec) {
        cin>>i;
    }
    sort(vec.begin(),vec.end());
    int ans=1;
    for(int x=0;x<N;x++){
        for(int y=x+1;y<N;y++){
            int d=vec[y]-vec[x];
            if(m[x].find(d)!=m[x].end()){
                m[y][d]=m[x][d]+1;
            }
            else m[y][d]=2;
            ans=max(ans,m[y][d]);
        }
    }
    cout<<ans;
}

'PS > boj' 카테고리의 다른 글

백준 15559 내 선물을 받아줘  (0) 2022.07.17
백준 2069 보이는 산맥 (C++)  (0) 2022.07.15
백준 3678 카탄의 개척자 (C++)  (0) 2022.07.13
백준 1744 수 묶기 (C++)  (0) 2022.07.12
백준 23325 마법천자문 (C++)  (0) 2022.07.10