-
반응형
https://www.acmicpc.net/problem/1633
1633번: 최고의 팀 만들기
꿍 협회는 매년 세계체스대회에 나갈 팀을 만들고 있다. 팀은 흑으로 플레이하는 15명과 백으로 플레이하는 15명, 총 30명으로 이루어진다. 꿍 협회는 가능한 최고의 팀을 만들려고 하는데 각 플
www.acmicpc.net
풀이
모든 선수를 탐색하며, 만약 현재까지 백팀에 15명이 안찼을때 백팀에 넣은경우, 흑팀에 15명이 안찼을때 흑팀에 넣은경우, 어느 팀에도 넣지 않은경우 3가지와 현재상태중 최댓값을 넣어주면된다.
이때 DP의 Memoization을 이용해서 시간을 단축시켜준다.
또한 문제에서 주어진 입출력의 종료조건이 따로 주어지지 않아서 scanf로 받고, EOF가 아닐때까지로 조건을 주었다.
코드
#include<iostream> #include<algorithm> #include<memory.h>//memset #include<vector> #include<cstdio> #define _CRT_SECURE_NO_WARNINGS. using namespace std; vector<pair<int, int>> v; int dp[1001][16][16]; int dfs(int white, int black, int ind) { if (ind == v.size()) { return 0;//end point } if (dp[ind][white][black] != -1) { return dp[ind][white][black];//memoization } if (white <15) { //백 선택 dp[ind][white][black] = max(dp[ind][white][black], v[ind].first+dfs(white+1,black,ind+1)); } if (black <15) { //흑 선택 dp[ind][white][black] = max(dp[ind][white][black], v[ind].second + dfs(white, black+1, ind + 1)); } dp[ind][white][black] = max(dp[ind][white][black], dfs(white, black, ind + 1));//아무것도 선택x 계산 후 리턴 return dp[ind][white][black]; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int a, b; while (scanf("%d %d",&a,&b)!=EOF) { v.push_back({ a,b }); } memset(dp, -1, sizeof(dp)); cout << dfs(0,0, 0) << "\n"; return 0; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 15684번 사다리 조작 (0) 2021.08.26 [백준OJ] 6137번 문자열 생성 (0) 2021.08.25 [백준OJ] 14595번 동방 프로젝트 (Large) (0) 2021.08.23 [백준OJ] 3980번 선발 명단 (0) 2021.08.22 [백준OJ] 14600번 샤워실 바닥 깔기 (Small) (0) 2021.08.20 댓글