您的位置:首页 > 其它

uva 11766 - Racing Car Computer(dp)

2014-03-27 10:57 477 查看
题目链接: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

, dp
;

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

int main () {
int cas = 1;
while (scanf("%d", &n) == 1 && n) {
init ();
printf("Case %d: %d\n", cas++, solve());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: