HDU 4293 Groups

Groups

Time Limit: 1000ms

Memory Limit: 32768KB

This problem will be judged on HDU. Original ID: 4293
64-bit integer IO format: %I64d      Java class name: Main

  After the regional contest, all the ACMers are walking alone a very long avenue to the dining hall in groups. Groups can vary in size for kinds of reasons, which means, several players could walk together, forming a group.
  As the leader of the volunteers, you want to know where each player is. So you call every player on the road, and get the reply like “Well, there are Ai players in front of our group, as well as Bi players are following us.” from the ith player.
  You may assume that only N players walk in their way, and you get N information, one from each player.
  When you collected all the information, you found that you’re provided with wrong information. You would like to figure out, in the best situation, the number of people who provide correct information. By saying “the best situation” we mean as many people as possible are providing correct information.

Input

  There’re several test cases.
  In each test case, the first line contains a single integer N (1 <= N <= 500) denoting the number of players along the avenue. The following N lines specify the players. Each of them contains two integers Ai and Bi (0 <= Ai,Bi < N) separated by single spaces.
  Please process until EOF (End Of File).

Output

  For each test case your program should output a single integer M, the maximum number of players providing correct information.

Sample Input

3
2 0
0 2
2 2
3
2 0
0 2
2 2

Sample Output

2
2

Hint

The third player must be making a mistake, since only 3 plays exist.

Source

2012 ACM/ICPC Asia Regional Chengdu Online

$解题:动态规划,dp[i]表示前i个人正确的人数最多的值$

$cnt[i][j]表示说前有i个人 后有j人的个数$

$那么dp[i] = max(dp[i],dp[j] + cnt[j][n-i])$

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 510;
 4 int dp[maxn],cnt[maxn][maxn],n;
 5 int main(){
 6     int u,v;
 7     while(~scanf("%d",&n)){
 8         memset(dp,0,sizeof dp);
 9         memset(cnt,0,sizeof cnt);
10         for(int i = 0; i < n; ++i){
11             scanf("%d%d",&u,&v);
12             if(u + v < n && cnt[u][v] < (n - u - v)) cnt[u][v]++;
13         }
14         for(int i = 1; i <= n; ++i){
15             for(int j = 0; j < i; ++j)
16                 dp[i] = max(dp[i],dp[j] + cnt[j][n-i]);
17         }
18         printf("%d\n",dp[n]);
19     }
20     return 0;
21 }

时间: 2024-08-28 19:19:57

HDU 4293 Groups的相关文章

HDU 4293 Groups (线性dp)

OJ题目:click here~~ 题目分析:n个人分为若干组 , 每一个人描写叙述其所在的组前面的人数和后面的人数.求这n个描写叙述中,最多正确的个数. 设dp[ i ] 为前i个人的描写叙述中最多正确的个数,则dp[ n ] 为要求的.num[ i ][ j ]  保存说前面有i个人 , 后面有j个人的人数,显然num[ i ][ j ]不超过n - i - j; 转移方程dp[ i ] = max(dp[ i ] , dp[ j ]  + num[ j ][ n - i ])  ,详解见代

HDU 4293 Groups(区间dp)

HDU 4293 题意:有 n 个人,可任意分成若干组,然后每个人各提供一个信息,表示他们组前面有多少个人,后面有多少个人.问最多有多少个信息是真实的的. 思路: 这道题一开始给我的印象是什么乱七八糟的东西,后来也没想通到底该怎么做,好在赛后百度在手天下我有:) 我们可以把 这n个人看成一段区间 [1,n]. 设每个人的信息是a.b,则这个信息代表了他们组所在的区间 [a+1,n-b]. 若a+b>n,显然撒谎,跳过不做处理. 我们用一个Map[i][j]数组将同在一区间[i,j]的人数纪录下来

HDU - 4293 Groups (DP)

题目大意:有N个人,人人之间可以组成一个团队,现在N个人各说一句话,说自己前面有多少人,后面有多少人 现在要求你判断这N个人中最多有多少人说真话 解题思路:参考了别人的 设有n个人,其中有一个人说了他前面有a个人,后面有b个人,那么他所在的区间就变成了[a + 1, n - b],那么就可以将这个人归到[a + 1, n - b] 如果[a + 1, n - b]的区间的人数超过了 n - a -b,那么就可以将其他的人忽略掉,因为这个区间最多有n-a-b个人 那么现在的问题就变成了,如何选择不

hdu 4293 区间DP

1 /* 2 题目大意:n个人分成若干组,每个人都描叙他们组前面有多少人后面有多少人, 3 求说真话的人最多有多少个. 4 解题思路:把同一组的人数统计起来他们组前面有x人后面有y人, 5 num[x+1][n-y]表示区间[x+1,n-y]的权值,num[x+1][n-y]<=n-x-y 6 那么就是求不重合,[1,n]区间的最大值 7 */ 8 #include <iostream> 9 #include <cstdio> 10 #include <cstring&

DP题目

//HDU 4001 To Miss Our Children Time HDU 4433 locker HDU 4362 Dragon Ball[] HDU 3602 2012[] HDU 4385 Moving Bricks[] HLG 1067 QQ Farm[] HDU 4293 Groups HDU 3920 Clear All of Them I[] HDU 3466 Proud Merchants[] POJ 2923 Relocation[] HDU 3660 Alice and

一周总结4

一周总结 数论 POJ3058 题意:就是给定一个分数,要求把它化成二进制形式,求最小的循环节和循环节开始的位置. 首先约分化成最简分数形式p/q,然后化成二进制就是每次乘2大于1时,本位为1,该数取余,那么总会存在.则(p*2^i)%q=(p*2^j)%q,这里假设i<j,则可化为(p*2^(j-i))%q=1%q 因为gcd(p,q)==1,则2^(j-i)%q=1%q;这时就会想到欧拉公式,枚举q%2^(j-i)的欧拉函数值的因子就行了. POJ3696 题意:给定一个数字L,问是否存在一

屏姨讶们是h25vhc4y6ece5

说到这里,玄老的声音中明显多了几分悲怆的味道"他们都是好孩子,尽管他们未能真正毕业,但在学院的名册上,始终有着他们的名字.他们以学院的理想为理想,他们并不是没有毕业的实力,而是为了学院的理想战死了."-----------------------------------------------------------------------------周漪忍不住道:"有什么是学院不能帮你解决的?非要自己一个人去面对?难道你说出来我们会不帮你么?"可是--,聚能魂导炮

僦檬哨招瓤kdqg84x5hodqk1

台上,天煞斗罗黄津绪并没有催促双方进行下一场比赛,因为比赛台在刚才一战中被破坏的实在是太厉害了,马小桃的黑色凤凰火焰足足灼烧了一分多钟才消失.如果不进行修补,已经没法再继续比赛了.此时正由几位实力不俗的土系魂师快速修复着.自从进入史莱克学院之后,他们一直都在紧张的学习和修炼,哪有什么放松的时间.凌落宸的疑问则只是落在霍雨浩一个人身上,"极致之冰?"贝贝心中早有定计,低声道:"第一场我们赢了,我们就已经处于主动之中.我们现在最希望出现的.是第二场他们在冲动之下派出两名魂王,或者

滦谇淋坌招r6un44y803l1xog9y18

求收藏.求推荐票.求会员点击.刺入他额头的青色噬灵刻刀轻微震颤,奇异的是,那破入的创口并没有鲜血流出,反而是那噬灵刻刀竟然缓缓软化,化为青碧色的液体顺着那创口流入霍雨浩头部之中.霍雨浩呵呵一笑,道:"发现就发现呗,王冬,你现在是不是觉得特别虚弱,一点力气都用不出来啊?""战争最后虽然胜利了,但我们唐门暗器的作用也受到了极大的质疑.从那以后,各国开始大幅度削减对我们制作暗器的采购.而我们唐门赚钱虽然不少,但按照第一代门主的意思,大部分收入全都捐赠了出去.用来改善穷苦地区的平民生