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的位置最多有多少人的假设是成立的。
题目大意:有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; }
相关文章推荐
- UVA 11766 Racing Car Computer --DP
- UVA 11766 - Racing Car Computer(DP)
- uva 11766 Racing Car Computer(DP)
- uva 164 String Computer(DP)
- 最短路 uva12661 Funny Car Racing
- BZOJ 1443 [JSOI2009]游戏Game | UVALive 5882 Racing Car Trail
- uva 12661 funning car racing
- UVA 12661 Funny Car Racing
- UVA 12661 Funny Car Racing
- uva 11825 - Hackers' Crackdown dp
- uva 11584 - Partitioning by Palindromes(简单dp)
- UVA 11361 - Investigating Div-Sum Property(数位DP)
- UVA 题目11584 - Partitioning by Palindromes(DP)
- UVA1220Party at Hali-Bula(树形dp)
- UVA 1366-Martian Minging(DP)
- uva 10401 数位DP
- UVA 473 - Raucous Rockers (dp)
- UVALive-6485-Electric Car Rally(BFS)
- UVA 10529-Dumb Bones(概率dp)
- UVA 10859 Placing Lampposts(树上dp)