728x90
개요
문제 링크
골드 5, DP
부분 수열 중 가장 긴 등차 수열의 길이
접근
- LIS를 쓰는 문제인가? 했다가 골드5에 O(nlogn)을 묻지는 않을 것 같아서 pass. A가 100까지면 아하, A를 중심으로 루프를 돌려야 하는구나.
- dp[i][j] 에 들어가는 건 공차가 i이면서 끝값이 j인 등차수열의 최대 길이
- 업데이트는? 등차수열의 이전항이 끝값인 경우의 최대 길이 + 1 해주면 됨. 즉, dp[i][j] = dp[i][j-i]+1
- 주의할 점은 음수 공차도 되므로 음수 인덱스 방지를 해줘야 하는 것.
Pseudo code
for (i = 0~n)
for (j = -A~A)
v = a[i]
dp[j][v] = dp[j][v-j]+1
answer = max(dp)
Source code
#include <bits/stdc++.h>
using namespace std;
const int A = 100;
const int M = 300;
int dp[M][M];
int main() {
int n;
cin >> n;
int a;
int ans = 1;
for (int i=0; i<n; i++) {
cin >> a;
dp[a+A][a] = 1;
for (int j=-A; j<A; j++) {
int k = (a-j>0?a-j:0);
dp[j+A][a] = dp[j+A][k]+1;
ans = max(ans, dp[j+A][a]);
}
}
cout << ans;
}
728x90
'백준브실골 > DP' 카테고리의 다른 글
백준 23317, 구슬 굴리기 (0) | 2023.02.08 |
---|---|
백준 25634, 전구 상태 뒤집기 (0) | 2023.02.08 |
백준 25343, 최장 최장 증가 부분 수열 (0) | 2023.02.08 |
백준 16494, 가장 큰 값 (0) | 2023.02.08 |
백준 24430, 알고리즘 수업 - 행렬 경로 문제 7 (0) | 2023.02.08 |
백준 1943, 동전 분배 (0) | 2023.02.08 |
백준 2218, 상자 안의 구슬 (0) | 2023.02.08 |
백준 2228, 구간 나누기 (0) | 2023.02.08 |
댓글