题目链接: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; }