[伯俊]14501退社(シルバー4)


白駿(シルバー4)-14501.退社(シルバー4)

に答える


耳で解いた!
ちょっと考えたら部分集合で解けた
毎週2つの選択肢があります.当日の問い合わせではなく!
問い合わせがない場合は、1日だけ日付を上げてから解決を呼びます.
		//선택하지 않았을 경우
		solve(day+1, sum);	
選択すると、相談にかかる時間と日数に、相談と受けたお金を合計して、解決を呼びます.
ソロを呼ぶ前に、辞める前かどうかをチェックします.
		//선택했을 경우-day체크도 해야한다.
		if(arr[day][0] + day<=n)
			solve(day+arr[day][0],sum+arr[day][1]);
コード全体を以下に示します.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static public int max,n;
	static public int[][] arr;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		n = Integer.parseInt(br.readLine());
		arr = new int[n][2];
		
		for(int i=0; i<n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
		}
		
		max = 0;
		solve(0,0);
		System.out.println(max);
	}
	
	static public void solve(int day, int sum) {
		//기저조건
		if(n == day) {
			max = Math.max(max, sum);
			return;
		}
		
		//선택했을 경우-day체크도 해야한다.
		if(arr[day][0] + day<=n)
			solve(day+arr[day][0],sum+arr[day][1]);
		
		//선택하지 않았을 경우
		solve(day+1, sum);	
	}
}