热门标签 | 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)



推荐阅读
  • 本文介绍了一个来自AIZU ONLINE JUDGE平台的问题,即清洁机器人2.0。该问题来源于某次编程竞赛,涉及复杂的算法逻辑与实现技巧。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 本文探讨了线性表中元素的删除方法,包括顺序表和链表的不同实现策略,以及这些策略在实际应用中的性能分析。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • JavaScript 中引号的多层嵌套使用技巧
    本文详细介绍了在 JavaScript 编程中如何处理引号的多级嵌套问题,包括双引号、单引号以及转义字符的正确使用方法。 ... [详细]
  • 解决UIScrollView自动偏移问题的方法
    本文介绍了一种有效的方法来解决在使用UIScrollView时出现的自动向下偏移的问题,通过调整特定的属性设置,可以确保滚动视图正常显示。 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • 3DSMAX制作超现实的体育馆模型
    这篇教程是向脚本之家的朋友介绍3DSMAX制作超现实的体育馆模型方法,教程制作出来的体育馆模型非常地不错,不过教程有点难度,需要有一定基础的朋友学习,推荐到脚本之家,喜欢的朋友可 ... [详细]
  • 本文介绍了如何在AngularJS应用中使用ng-repeat指令创建可单独点击选中的列表项,并详细描述了实现这一功能的具体步骤和代码示例。 ... [详细]
  • 在项目冲刺的最后一天,团队专注于软件用户界面的细节优化,包括调整控件布局和字体设置,以确保界面的简洁性和用户友好性。 ... [详细]
  • JavaScript 页面卸载事件详解 (onunload)
    当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
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社区 版权所有