BZOJ 2298 problem a(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2298

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

思路:对于第i个人来说,区间[ai+1,n-bi]的人的分数相同。那么我们用sum[L][R]表示区间[L,R]中总人数。用f[i]表示前i个人中说真话的最大人数,那么f[j]=max(f[i-1]+sum[i][j])。

map<pair<int,int > ,int> mp;
vector<int> V[N];
int n,f[N]; 

int main()
{
    RD(n);
    int i,x,y,L,R;
    FOR1(i,n)
    {
        RD(x,y);
        L=x+1; R=n-y;
        if(L>R) continue;
        if(mp.count(MP(L,R)))
        {
            if(mp[MP(L,R)]<R-L+1) mp[MP(L,R)]++;
        }
        else mp[MP(L,R)]=1,V[R].pb(L);
    }
    int j;
    FOR1(i,n)
    {
        f[i]=f[i-1];
        FOR0(j,SZ(V[i]))
        {
            L=V[i][j];
            upMax(f[i],f[L-1]+mp[MP(L,i)]);
        }
    }
    PR(n-f[n]);
}

BZOJ 2298 problem a(DP),布布扣,bubuko.com

时间: 2024-11-10 00:33:20

BZOJ 2298 problem a(DP)的相关文章

BZOJ 1076 奖励关(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1076 题意:n种宝物,每个宝物有两个属性: (1)价值:(2)该宝物的集合S,只有得到了集合S中的宝物时才能得到该宝物.每次从一个黑箱子中随机拿出一个宝物k,若k的集合S中的宝物都已经得 到,则k可要(也可不要),否则k不能要.每次拿到任意宝物概率相等.求随机拿K次的最大期望得分. 思路:从后向前,设f[i][j]表示到第i次拿完宝物,状态为j的最大价值.枚举i+1次拿的宝物k,若k的

BZOJ 1560 火星藏宝图(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1560 题意: 思路:f[i]表示到达i的最大收益.这样是 O(n^2)的.我们考虑,由于转移的条件,a^2+b^2<(a+b)^2,因此对于三个点A.B.C.若A能到B,B能到C,那么A也能到C, 但是不如经过B更好.因此,我们记录到达第j列最靠下的i即可.那么转移(x,y)时,用记录的前y列即可. struct node { int x,y,w; }; node a[N]; int

BZOJ 1801 中国象棋(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1801 题意:在n*m的棋盘上放若干炮使得不互相攻击.有多少种放法?可以放0个.1个....只要不互相攻击就行.. 思路:f[i][j][k]前i行j列有1个炮.k列有两个炮. int n,m; i64 f[N][N][N]; void up(i64 &x,i64 y) { x+=y; x%=mod; } i64 C(int x) { return x*(x-1)/2; } int ma

BZOJ 2306 幸福路径(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2306 题意:给出一个有向图,点有权值 a.初始时在点S.一个人在初始点能量为K=1,每走到下一个点能量值乘以p(p<1),到达一个点u 幸福度为 a[u]*K.求最大的幸福度. 思路:最后必然是走了一条链,或者是一个环(一直绕),或者是一条链加一个环.设f[i][j][k]表示从点j走了i步到达节点k的最大幸福度.那么f[i][j][j]就表示在绕环.那么在这个环上一直绕下去的期望为:

BZOJ 1925 地精部落(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1925 题意:求1到n个所有排列中有多少种满足高低交错. 思路:f[n][k]表示n个数,最后一个为k且最后两个递增,g[n][k]表示n个数最后一个数为k且最后两个递减.对于f[n][k],若我们将每个数x换为n+1-x,则就成了g[n][n+1-k],因此有:f[n][k]=g[n][n+1-k].那么可得: 由于对称性,我们计算出: 那么最后的答案就是2ans. i64 f[2][

[BZOJ 1260][CQOI2007]染色(DP)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1260 分析: f[i][j]表示i~j刷成s[i]~s[j]这个样子需要的最小次数 则若s[i]==s[j]:f[i][j]=min(f[i+1][j],f[i][j-1],f[i+1][j-1]+1) 若s[i]!=s[j]:f[i][j]=min(f[i][k]+f[k+1][j])

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>

BZOJ 1413 取石子游戏(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1413 题意:n堆石子排成一排.每次只能在两侧的两堆中选择一堆拿.至少拿一个.谁不能操作谁输. 思路:参考这里. int f1[N][N],f2[N][N],n,a[N]; void deal() { RD(n); int i,j,k; FOR1(i,n) RD(a[i]),f1[i][i]=f2[i][i]=a[i]; int p,q,x; for(k=2;k<=n;k++) for(

BZOJ 1978 取数游戏(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1978 题意:给出一个数列a,在其中找出下标依次增大的数,使得任意相邻的两个数的最大公约数大于等于m.找出最多的数字. 思路:f[i]表示前面的数字中最大公约数为i可以找出的最多的数字个数.那么对于当前数字x: 接着更新f: int f[N],a[N]; int n,m; int main() { RD(n,m); int i; FOR1(i,n) RD(a[i]); int j,k;