음준희 블로그
백준 16474 : 이상한 전깃줄(DP, LIS) 본문
https://www.acmicpc.net/problem/16474
16474번: 이상한 전깃줄
엘리트 도로설계사 현정이는 도로 위 전봇대 사이에 연결된 전깃줄을 관리하는 일을 한다. 도로 양 옆에는 각 고유번호를 갖고 있는 전봇대가 여러 개 있다. 마을에 최대한 많은 양의 전력을 보
www.acmicpc.net
풀이
본인은 LIS로 접근하지 못해서 DP로 접근함
DP[n][m]=왼쪽 n번째 전봇대와 m번째 전봇대를 이으려 할때 연결 가능한 최대 전깃줄 수
만약 n->m으로 연결하는 전깃줄이 있을 경우
DP[n][m]=max(DP[n-1][m-1]+1, DP[n-1][m])
전깃줄이 없을 경우는
DP[n][m]=max(DP[n-1][m],DP[n][m-1])
시간복잡도 : O(n * m) , n , m <=2000
#include<bits/stdc++.h>
#include<time.h>
#define MAX 1000000007
#define INF 2000000000
#define MOD 1000000007
using namespace std;
typedef long long ll;
typedef pair<int, int > pii;
typedef pair<long long, long long> pll;
typedef pair<double, double> pdd;
int dx[8] = { 0, -1, 0, 1, 1, 1, -1, -1 };
int dy[8] = { -1, 0, 1, 0, -1, 1, 1, -1 };
/*
int dx[2][6] = {
{1, -1, 0, 0 ,1, -1},
{1, -1, 0, 0, -1, 1}
};
int dy[2][6] = {
{0, 0, 1, -1 ,1, -1},
{0, 0, 1, -1, 1, -1}
};*/
//int dx[8] = { -1, -1, 1, 1, -2, -2, 2, 2 };
//int dy[8] = { 2, -2, 2, -2, -1, 1, -1, 1 };
void init() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
}
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }
int left_idx[2001];
int right_idx[2001];
int dp[2001][2001];
int main() {
init();
int n, m; cin >> n >> m;
int num;
for (int i = 1; i <= n; i++) {
cin >> num;
left_idx[num] = i;
}
for (int i = 1; i <= m; i++) {
cin >> num;
right_idx[num] = i;
}
int k; cin >> k;
for (int i = 0; i < k; i++) {
int a, b; cin >> a >> b;
dp[left_idx[a]][right_idx[b]] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j] = max(dp[i - 1][j], max(dp[i - 1][j - 1] + dp[i][j], dp[i][j - 1]));
}
}
cout << k - dp[n][m] << "\n";
}'알고리즘 > 백준' 카테고리의 다른 글
| 스터디 23/01/07 2302 : 극장 좌석 (0) | 2023.01.13 |
|---|---|
| 스터디 23/01/07 2535 : 아시아 정보올림피아드 (0) | 2023.01.13 |
| 백준 11666 : 워크스테이션 배정 (그리디) (1) | 2023.01.10 |
| 백준 2842 : 잡배원 한상덕 (투포인터) (0) | 2023.01.06 |
| 백준 20188 : 등산 마니아 (트리 DP) (0) | 2023.01.04 |