uva 11766 - Racing Car Computer(dp)

题目链接:uva 11766 - Racing Car Computer


题目大意:有n个人进行比赛,给出每个人的状况,a表示这个人前面有a个人,b表示说这个人后面有b个人。问说最少有多少个人的状态是不成立的。


解题思路:对于一个人来说,在他前面有a个人,在他后面有b个人,那么他的可能排名即为[a+1,n-b],并且隐含的条件就是说其实有n-b-a-1是和该人并排的。


同样的如果有人的区间重叠的,那么他们之间肯定是矛盾的。因为[l1,r1]是并排的存在,[l2,r2]也是并排的存在,如果两个区间重叠,那么重叠的区间[l1,r2],重叠的人数即为r2 - l1 + 1,不满足[l1,r1]的并排人数。


然后需要注意[l,r]最多页只能满足r-l+1个人是成立的。


dp[i]表示说到排名i的位置最多有多少人的假设是成立的。


#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;
const int N = 1005;

int n, w[N][N], dp[N];

void init () {
	int a, b;
	memset(w, 0, sizeof(w));
	for (int i = 0; i < n; i++) {
		scanf("%d%d", &a, &b);
		w[a+1][n-b]++;
	}
}

int solve () {

	for (int i = 1; i <= n; i++) {
		dp[i] = 0;
		for (int j = 0; j < i; j++)
			dp[i] = max(dp[i], dp[j] + min(w[j+1][i], i - j));
	}
	return n - dp[n];
}

int main () {
	int cas = 1;
	while (scanf("%d", &n) == 1 && n) {
		init ();
		printf("Case %d: %d\n", cas++, solve());
	}
	return 0;
}


你可能感兴趣的:(uva 11766 - Racing Car Computer(dp))