BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(dp)

题意

题目描述的很清楚。。。

 有一天,贝茜无聊地坐在蚂蚁洞前看蚂蚁们进进出出地搬运食物.很快贝茜发现有些蚂蚁长得几乎一模一样,于是她认为那些蚂蚁是兄弟,也就是说它们是同一个家族里的成员.她也发现整个蚂蚁群里有时只有一只出来觅食,有时是几只,有时干脆整个蚁群一起出来.这样一来,蚂蚁们出行觅食时的组队方案就有很多种.作为一头有数学头脑的奶牛,贝茜注意到整个蚂蚁群由T(1≤T≤1000)个家族组成,她将这些家族按1到T依次编号.编号为i的家族里有Ni(1≤Ni≤100)只蚂蚁.同一个家族里的蚂蚁可以认为是完全相同的.     如果一共有S,S+1….,B(1≤S≤B≤A)只蚂蚁一起出去觅食,它们一共能组成多少种不同的队伍呢?注意:只要两支队伍中所包含某个家族的蚂蚁数不同,我们就认为这两支队伍不同.由于贝茜无法分辨出同一家族的蚂蚁,所以当两支队伍中所包含的所有家族的蚂蚁数都相同时,即使有某个家族换了几只蚂蚁出来,贝茜也会因为看不出不同而把它们认为是同一支队伍.   

Sol

裸的dp比较好想,$f[i][j]$表示前$i$个家族,选了$j$个蚂蚁

转移的时候枚举这个选了几个

这玩意儿显然可以用前缀和优化,空间问题用滚动数组处理

有一个小trick:在处理前缀和的时候我们可以保留下本层dp的信息,所以滚动数组是不需要的,具体看代码吧

#include<cstdio>
#include<algorithm>
#include<cstring>
#define pt(x) printf("%d ", x);
using namespace std;
const int MAXN = 1e5 + 10, mod = 1000000;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); 
    return x * f;
}
int T, A, L, R;
int num[MAXN], f[MAXN], sum[MAXN], s;
int main() {
    T = read(); A = read(); L = read(); R = read();
    for(int i = 1; i <= A; i++) num[read()]++;
    for(int i = 0; i <= num[1]; i++) sum[i] = 1;
    for(int i = 1; i <= T; i++) {
        s += num[i];    
        for(int j = 0; j <= s; j++) {
            int x = j - num[i] - 1;
            f[j] = sum[j];
            if(x >= 0) f[j] = (f[j] - sum[x] + mod) % mod;
        }    
        sum[0] = f[0];
        for(int j = 1; j <= s + num[i + 1]; j++) 
            sum[j] = (sum[j - 1] + f[j]) % mod;
        if(i != T) memset(f, 0, sizeof(f));
    }
    int ans = 0;
    for(int i = L; i <= R; i++)
        (ans += f[i]) %= mod;
    printf("%d", ans % mod);
    return 0;
}
/*
3 5 1 5
1
2
2
1
3
*/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

给JAVA,说句公道话

常常总有人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 所以我现在来解释一下。 Java超越了所有咒骂它的“动...

21850
来自专栏牛客网

字节跳动一面凉经

【每日一语】如果这世界上真有奇迹,那只是努力的另一个名字。生命中最难的阶段,不是没有人懂你,而是你不懂你自己。——尼采

63010
来自专栏程序员宝库

每个程序员都应该收藏的算法复杂度速查表

这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 O 复杂度。我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时...

9620
来自专栏牛客网

美图春招产品实习面经

28010
来自专栏理论坞

帕金森定律

如果你对这5道题的回答,有3个或3个以上的“是”,那么说明你已经深陷“帕金森定律”的陷阱之中;如果你想从目前的困境当中解脱出来,就徐需要了解帕金森定律了,想要更...

12740
来自专栏Albert陈凯

函数式编程很难,这正是你要学习它的原因

英文原文:Functional Programming Is Hard,That's Why It's Good   很奇怪不是,很少有人每天都使用函数...

29140
来自专栏程序员的SOD蜜

从程序员视角和编程语言角度看【中医】:一种生命健康编程语言

16820
来自专栏IT派

Node.js 用户量会不会在一年内超越 Java?

在最近 The New Stack 的采访 中,Node.js 基金会的社区组织者 Mikeal Rogers 表示 Node.js 用户量将在一年内超越 Ja...

38060
来自专栏编程

C加加的学习方法!

学习C++重在理解其各种语言设施所代表的语义,以及C++所能表示的语义所代表的设计思想。首先从宏观上入手,你需要明白的是C++是程序设计语言的本质。在此我把C+...

19360
来自专栏包子铺里聊IT

浅谈Java面试过程中的Encapsulation, Inheritance and Polymorphism

在Java面试过程中,我们通常会被问到作为一门OOP的语言,最主要的特点有哪些? 或许很多同学在实际的应用中都能够慢慢的总结出OOP这种语言在实际工作中所带...

363110

扫码关注云+社区

领取腾讯云代金券