https://www.acmicpc.net/problem/31434
태그 : dp
이제는 문제를 읽으면 이 정도는 바로 dp라고 떠올릴 수 있는 것 같다.
매 초 행동은 1 + N가지이다. 그냥 s 그대로 당근 구매 / N번 스피드 효과 구매
dp[i][j] = i초에서 j 스피드 경우에 가질 수 있는 최대 당근 갯수
로 놓고 상태 전이만 잘 해주면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, K;
static int [] a = new int [101];
static int [] b = new int [101];
static int [][] dp = new int [101][5001];
static int ans;
static void solve() {
for (int i = 0; i <= K; ++i) {
for (int j = 0; j < 5001; ++j) {
dp[i][j] = -1;
}
}
dp[0][1] = 0;
for (int i = 1; i <= K; i++) {
for (int j = 5000; j >= 0; --j) {
if (dp[i - 1][j] >= 0) {
dp[i][j] = j + dp[i - 1][j];
for (int k = 1; k <= N; ++k) {
if (dp[i - 1][j] >= a[k]) {
dp[i][j + b[k]] = Math.max(dp[i][j + b[k]], dp[i - 1][j] - a[k]);
}
}
}
}
}
for (int i = 0; i < 5001; ++i) {
if (dp[K][i] > ans) {
ans = dp[K][i];
}
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
st = new StringTokenizer(br.readLine().trim());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine().trim());
a[i] = Integer.parseInt(st.nextToken());
b[i] = Integer.parseInt(st.nextToken());
}
solve();
System.out.println(ans);
}
}
보유 당근 상태가 0인걸 어떻게 처리하지..? 하다가
dp테이블의 두번째 인덱스를 보유 당근 수, 값을 스피드로 처리하는 뻘짓을 했다.
그냥 테이블을 INF로 초기화 하면 되는걸...