[BOJ]14501号退社c++
9113 ワード
https://www.acmicpc.net/problem/14501
質問する
コンサルタントの白俊さんが会社を辞めます.
今日からN+1日で辞めるために、残りのN日にできるだけ多くの相談をします.
白俊は秘書にできるだけ多くの相談を依頼し、秘書は1日に1回異なる人に相談を手配した.
各コンサルティングは,コンサルティングを完了するのに要する時間内にTIとコンサルティングを行う際に得られる金額Piからなる.
N=7の場合は、以下のコンサルティングスケジュールを参照してください.
-1日2日3日4日5日6日7日
1日のカウンセリングは全部で3日かかりますが、カウンセリング時にもらえる金額は10です.5日間のお問い合わせは2日間かかりますが、受け付けられる金額は15です.
相談にかかる時間は1日以上かかる場合がありますので、すべての相談はできません.例えば、1日に問い合わせを行った場合、2日、3日に問い合わせをすることはできません.2日に問い合わせをすれば、3、4、5、6日には問い合わせができない.
なお、N+1日は会社にいないため、6,7日は相談できません.
退職前にカウンセリングを行う最大の利益は1日、4日、5日にカウンセリングを行うことであり、その際の利益は10+20+15=45である.
商談がうまくいけば、白俊に最大の収益をもたらす計画を立ててください.
入力します.
7
3 10
5 20
1 10
1 20
2 15
4 40
2 200
出力します.
45
入力します.
10
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
出力します.
55
入力3
10
5 10
5 9
5 8
5 7
5 6
5 10
5 9
5 8
5 7
5 6
出力します.
20
入力4
10
5 50
4 40
3 30
2 20
1 10
1 10
2 20
3 30
4 40
5 50
出力します.
90
#include <iostream>
#include <cstdio>
using namespace std;
int N;
int arr[16][2];
int benefit = 0;
void dfs(int x, int b) {
if(x > N)
return;
for(int i = x; i <= N; i++) {
if(i + arr[i][0] - 1 <= N) {
benefit = max(benefit, b + arr[i][1]);
dfs(i + arr[i][0], b + arr[i][1]);
}
}
}
int main() {
scanf("%d", &N);
for(int i = 1; i <= N; i++)
scanf("%d %d", &arr[i][0], &arr[i][1]);
for(int i = 1; i <= N; i++) {
if(i + arr[i][0] - 1 <= N) {
benefit = max(benefit, arr[i][1]);
dfs(i + arr[i][0], arr[i][1]);
}
}
printf("%d\n", benefit);
}
問題自体はDPに分類されるが,15の大きさは大きくなくDFSを用いることができる.Reference
この問題について([BOJ]14501号退社c++), 我々は、より多くの情報をここで見つけました https://velog.io/@chowisely/BOJ-14501テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol