UVA 672 - Gangsters(dp)

3720 단어


  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; }

좋은 웹페이지 즐겨찾기