UVA 672 - Gangsters(dp)
Gangsters
N gangsters are going to a restaurant. The i-th gangster comes at the time Ti and has the prosperity Pi. The door of the restaurant has K+1 states of openness expressed by the integers in the range [0, K]. The state of openness can change by one in one unit of time; i.e. it either opens by one, closes by one or remains the same. At the initial moment of time the door is closed (state 0). The i-th gangster enters the restaurant only if the door is opened specially for him, i.e. when the state of openness coincides with his stoutnessSi. If at the moment of time when the gangster comes to the restaurant the state of openness is not equal to his stoutness, then the gangster goes away and never returns.
The restaurant works in the interval of time [0, T].
The goal is to gather the gangsters with the maximal total prosperity in the restaurant by opening and closing the door appropriately.
Input
The first line of the input is an integer M, then a blank line followed by M datasets. There is a blank line between datasets.
The first line of each dataset contains the values N, K, and T, separated by spaces. ()
The second line of the dataset contains the moments of time when gangsters come to the restaurant, separated by spaces. ( for )
The third line of the dataset contains the values of the prosperity of gangsters , separated by spaces. ( for )
The forth line of the dataset contains the values of the stoutness of gangsters , separated by spaces. ( for )
All values in the input file are integers.
Output
For each dataset, print the single integer - the maximal sum of prosperity of gangsters in the restaurant. In case when no gangster can enter the restaurant the output should be 0. Print a blank line between datasets.
Sample Input
1
4 10 20
10 16 8 16
10 11 15 1
10 7 1 8
Sample Output
26
제목:
어떤 호텔의 문은 사이즈를 바꿀 수 있는데 변화 범위는 [0,k]이다. 이 문은 초당 사이즈가 1씩 커질 수도 있고 1을 줄일 수도 있고 변하지 않을 수도 있다.
현재 n명이 있는데 그들의 사이즈는si이다. 모든 사람이ti시간에 호텔에 들어가고 싶어한다. 단지ti시간에 호텔문 사이즈가 이 사람의 사이즈와 꼭 같아야 이 사람이 들어갈 수 있다.
사람마다 Pi가 하나씩 있는데 누군가가 호텔에 들어가면 호텔에서 Pi가 증가한다.
[0, T] 동안 (0초 동안 호텔의 문 사이즈 상태는 0) 일부 사람들이 호텔에 들어갈 수 있도록 하여 총 Pi치가 가장 크도록 했다.
사고방식: dp, 정의 dp[i]는 제i 개인이 들어갈 수 있는 상황의 최대 p값을 나타낸다. 상태 이동 방정식은 (if dp[j] 상태가 존재하고 dp[j]가 dp[i] 상태로 들어갈 수 있음) dp[i] = dp[j] + p[i]이다.
코드:#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N = 105;
int T, n, k, t, i, j, dp[N];
struct Man {
int t, p, s;
} m[N];
bool cmp(Man a, Man b) {
return a.t < b.t;
}
int solve() {
int ans = 0;
sort(m + 1, m + n + 1, cmp);
memset(dp, -1, sizeof(dp));
dp[0] = 0;
for (i = 1; i <= n; i++) {
for (j = 0; j < i; j++) {
int Time = m[i].t - m[j].t;
int s = abs(m[i].s - m[j].s);
if (s > Time || dp[j] == -1) continue;
dp[i] = max(dp[i], dp[j] + m[i].p);
}
ans = max(ans, dp[i]);
}
return ans;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &k, &t);
for (i = 1; i <= n; i++)
scanf("%d", &m[i].t);
for (i = 1; i <= n; i++)
scanf("%d", &m[i].p);
for (i = 1; i <= n; i++)
scanf("%d", &m[i].s);
printf("%d
", solve());
if (T) printf("
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
1
4 10 20
10 16 8 16
10 11 15 1
10 7 1 8
26
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N = 105;
int T, n, k, t, i, j, dp[N];
struct Man {
int t, p, s;
} m[N];
bool cmp(Man a, Man b) {
return a.t < b.t;
}
int solve() {
int ans = 0;
sort(m + 1, m + n + 1, cmp);
memset(dp, -1, sizeof(dp));
dp[0] = 0;
for (i = 1; i <= n; i++) {
for (j = 0; j < i; j++) {
int Time = m[i].t - m[j].t;
int s = abs(m[i].s - m[j].s);
if (s > Time || dp[j] == -1) continue;
dp[i] = max(dp[i], dp[j] + m[i].p);
}
ans = max(ans, dp[i]);
}
return ans;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &k, &t);
for (i = 1; i <= n; i++)
scanf("%d", &m[i].t);
for (i = 1; i <= n; i++)
scanf("%d", &m[i].p);
for (i = 1; i <= n; i++)
scanf("%d", &m[i].s);
printf("%d
", solve());
if (T) printf("
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.