热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【动态规划】统计蚂蚁(ants)

题目描述蚂蚁山上有T(1

题目

描述


蚂蚁山上有T(1<=T<=1,000)种蚂蚁,标记为1..T,每种蚂蚁有N_i只蚂蚁(1<=N_i<=100),现有A(A<=5000)只蚂蚁,从中选出S,S+1,…,B(1<=S<=B<=A)只蚂蚁一共有多少种选法?
如有5只蚂蚁分别为{1,1,2,2,3},一共有3种蚂蚁,每一种蚂蚁的数量分别为2,2,1,以下是选不同数量蚂蚁的方法:
1个蚂蚁3种选法 : {1}{2}{3}
2个蚂蚁5种选法 : {1,1}{1,2}{1,3}{2,2}{2,3}
3个蚂蚁5种选法 : {1,1,2}{1,1,3}{1,2,2}{1,2,3}{2,2,3}
4个蚂蚁3种选法 : {1,2,2,3}{1,1,2,2}{1,1,2,3}
5个蚂蚁1种选法 : {1,1,2,2,3}
你的任务是从中选S..B只蚂蚁的方法总和。



输入


第一行: 4个空格隔开的整数: T, A, S和B;
第2到A+1行:每行一个整数表示蚂蚁的种类。



输出


输出从A只蚂蚁中选出S..B只蚂蚁的方法数,答案保留后6位。



样例输入

3 5 2 3
1
2
2
1
3

样例输出

10

大意

有 A 个 T 种物品,求取 \(i \in [S,B]\)共有多少种方法,答案取模 1000000


题解

首先用一个桶存储存每种蚂蚁的数量,设为 x[] 。


60分左右

动态规划,设 F[i][j] 为前 i 种物品选 j 个的方案数。则
\(F_{0,0}=1\)
\(F_{i,j}=\sum_{k=0}^{\min{(j,x_i)}} F_{i-1,j-k}\)
但是这样的时间复杂度是 \(O(T\sum x_i)\) ,会超时。


满分

上面的 F[i][] 都是从 F[i-1][] 得来的,因此我们想到了前缀和
设 S[i][j] 表示前 i 种物品取 0~i 个时的方案总和
前缀和我们并不陌生, \(S_{i,j}=S_{i,j-1}+F_{i,j}\)
那怎么求 F[i][j] 呢?
60 分做法时的公式得知,F[i][j] 等于 F[i-1][j-k] 到 F[i-1][j] 的和
这一段和就是 \(S_{i-1,j}-S_{i-1,j-k-1}\) ,也就是 \(S_{i-1,j}-S_{i-1,j-min(x[i],j)-1}\)
最后注意初始化
\(S[2\textit{~}A][0]=1\)
\(S[0][0\textit{~}T]=\min{(x[1],0\textit{~}T)+1}\)
就可以通过了


标程

#include
#define rg register int
using namespace std;
const int mod=1000000;
int n,m,l,r,t,x[5005],f[1005][5005],s[1005][5005],ans;
int main(){
freopen("ants.in","r",stdin);
freopen("ants.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&l,&r);
for(rg i=1;i<=m;i++) scanf("%d",&t),++x[t];
for(rg i=0;i<=m;i++) s[1][i]=min(i,x[1])+1;
for(rg i=2;i<=n;i++){
s[i][0]=1;
for(rg j=1;j<=m;j++){
f[i][j]=(s[i-1][j]-s[i-1][j-min(x[i],j)-1])%mod;
s[i][j]=(s[i][j-1]+f[i][j])%mod;
}
}
for(rg i=l;i<=r;i++) ans=(ans+f[n][i])%mod;
printf("%d",ans);
}

【动态规划】统计蚂蚁 (ants)



推荐阅读
  • zabbix监控服务日志关键字触发报警
    zabbix监控服 ... [详细]
  • 参考官方:https:docs.autofac.orgenlatestintegrationaspnetcore.html#startup-class有一些变动,现在暂时还没用ne ... [详细]
  • Centos 使用yum安装MongoDB 4.2
    1.配置MongoDB的yum源创建yum源文件:#cdetcyum.repos.d#vimmongodb-org-4.0.repo添加以下内容:(我们这里使用阿里云的源)[mng ... [详细]
  • 关于软件工程以及自我的解析
    对于软件工程这个课,一开始就有所期待的,通过以前的了解,觉得通过这个课程能让我们能够快速搭建一种框架,对于软件编程开发及其应用,是对于软件的构造解析,应该是思维上的理论知识。然而第 ... [详细]
  • CephPool资源池管理#查看ceph资源池cephosdlspools#创建资源池osdpoolcreate{}{rep ... [详细]
  • 设计模式(一)—— 策略模式
    简述:策略模式的适用的目标是多子类和单一父类的情形。父类中放的是很多子类共用的代码段,对于不同子类特殊的代码段交给子类进行编写。但如果两个或两个以上的子类需要共同的代码段时,不能将 ... [详细]
  • 水陆草木之花,可爱者甚蕃。晋陶渊明独爱菊。自李唐来,世人盛爱牡丹。予独爱莲之出淤泥而不染,濯清涟而不妖,中通外直,不蔓不枝,香远益清,亭亭净植,可远观而不可亵玩焉。予谓菊,花之隐逸 ... [详细]
  • Win7操作系统建立无线虚拟wifi
    网络适配器中的microsoftvirtualwifiminiportadapter是windows7的隐藏功能,虚拟wifi。正确的运用这个功能,就可以把电脑当做路由器了。注 ... [详细]
  • Java IO流学习总结(2)
    写在前面:本文章基本覆盖了javaIO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面。照旧,文章依 ... [详细]
  • ubuntu下安装source ... [详细]
  • EL&&JSTL
    EL表达式概念ExpressionLanguage表达式语言。作用替换和简化jsp页面中java代码的编写语法${表达式}注意jsp默认支持el表达式的。如果要忽略el表达式可以使 ... [详细]
  • HDU 3487 Play with Chain
    题意:对序列取出连续的一段接到剩下的第k个值后面,或者把一段序列反转。解题思路:splay区间操作。解题代码:1FileName:hdu3487.cpp2Author:darkdr ... [详细]
  • svnstat查看当前目录下svn状态svnremovexxxxsvnaddxx ... [详细]
  • 在Windows下配置安装OMNeT++ 4.0
    在Windows下配置安装OMN ... [详细]
  • 6.列表表格列表(1)liststyle基本语法语法取值使用说明设置列表项目相关样式。当liststyleimage和liststyletype都被指定了时,liststyleim ... [详细]
author-avatar
mobiledu2502905597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有