BZOJ 2298 problem a(区间DP)

题意:一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低。”问最少有几个人没有说真话(可能有相同的分数)

思路:考虑最多有多少人说真,那么答案就是n-max.

ai个人分数比他高,bi个人分数比他低,说明[bi+1,n-ai]里面的人分数相同。

用map维护某个区间是否相同.

 

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<vector>
 7 #include<map>
 8 int f[200005];
 9 std::map<std::pair<int,int>,int>mp;
10 std::vector<int>v[200005];
11 int n;
12 int main(){
13     scanf("%d",&n);
14     for (int i=1;i<=n;i++){
15         int x,y;
16         scanf("%d%d",&x,&y);
17         int L=x+1,R=n-y;
18         if (L>R) continue;
19         if (mp.count(std::make_pair(L,R))){
20             if (mp[std::make_pair(L,R)]<R-L+1)
21              mp[std::make_pair(L,R)]++;
22         }else{
23             
24             mp[std::make_pair(L,R)]=1;
25             v[R].push_back(L);
26         }
27     }
28     
29     for (int i=1;i<=n;i++){
30         std::vector<int>::iterator j;
31         f[i]=f[i-1];
32         for (j=v[i].begin();j!=v[i].end();j++){
33             int t=*j;
34             f[i]=std::max(f[i],f[t-1]+mp[std::make_pair(t,i)]);
35         }
36     }
37     printf("%d\n",n-f[n]);
38 }

 

posted @ 2016-06-02 17:25  GFY  阅读(323)  评论(0编辑  收藏  举报