【noi 2.6_9289】Ant Counting 数蚂蚁{Usaco2005 Nov}(DP)
题意:有M个家族的蚂蚁,各Ni只(互相相同)。问选出 l~r 只的不同方案数。
解法:很基础的一种DP,不要被“排列组合”所迷惑了啊~我之前接触过这个类型,可惜又忘了,一定要记住!
这是一种类型的DP——M种N个进行DP,定义f[i][j]表示前 i 种中(这题是“家族”)选了 j 个(“只”蚂蚁)的方案数。再进行分层DP。也类似于多重背包问题的解法。
所以状态f[i][j],是可以第 i 种选0~Ni只,也就是前 i-1 种选 j~j-Ni 只。
f[i][j] = f[i-1][j]+f[i-1][j-1]+...+f[i-1][j-Ni]
= f[i-1][j]+(f[i-1][j-1]+...+f[i-1][j-Ni]+f[i-1][j-Ni-1])-f[i-1][j-Ni-1]
= f[i-1][j]+f[i][j-1]-f[i-1][j-Ni-1]。 P.S.由于要保证 j 被减后>=0,所以我代码中用了比较后的k。
这样子利用前缀和优化时间+滚动数组优化空间就可以了。
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 #define M 1010
8 #define N 100010
9 #define mod 1000000
10
11 int a[N],h[M],f[2][N];//h[i]就是题目中的Ni
12 int mmin(int x,int y) {return x<y?x:y;}
13
14 int main()
15 {
16 int m,n,l,r;
17 scanf("%d%d%d%d",&m,&n,&l,&r);
18 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
19 sort(a+1,a+1+n);
20 int t=1; h[1]=1,h[m+1]=n+1;
21 for (int i=2;i<=n;i++)
22 if (a[i]!=a[i-1]) h[++t]=i;
23
24 f[0][0]=1;
25 for (int j=1;j<h[2];j++) f[0][j]=0;
26 int u=1;
27 for (int i=1;i<=m;i++)
28 {
29 f[u][0]=1;
30 for (int j=1;j<h[i+1];j++)
31 {
32 int k=mmin(h[i+1]-h[i],j);//当前状态对于第i种最多能选的个数
33 f[u][j]=((f[u][j-1]+f[1-u][j])%mod-f[1-u][j-k-1]%mod+mod)%mod;
34 //for (int k=0;k<=h[i+1]-h[i]&&k<=j;k++)
35 // f[i][j]+=f[i-1][j-k];
36 }
37 u=1-u;
38 }
39 int ans=0;
40 for (int j=l;j<=r;j++) ans=(ans+f[1-u][j])%mod;
41 printf("%d\n",ans);
42 return 0;
43 }
【noi 2.6_9289】Ant Counting 数蚂蚁{Usaco2005 Nov}(DP)的更多相关文章
- bzoj 2023: [Usaco2005 Nov]Ant Counting 数蚂蚁【生成函数||dp】
用生成函数套路推一推,推完老想NTT--实际上把这个多项式乘法看成dp然后前缀和优化一下即可 #include<iostream> #include<cstdio> using ...
- BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁
2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 56 Solved: 16[S ...
- 1630/2023: [Usaco2005 Nov]Ant Counting 数蚂蚁
2023: [Usaco2005 Nov]Ant Counting 数蚂蚁 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 85 Solved: 40[S ...
- bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁*&&bzoj1630[Usaco2007 Demo]Ant Counting*
bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁&&bzoj1630[Usaco2007 Demo]Ant Counting 题意: t个族群,每个族群有 ...
- bzoj1630 / bzoj2023 [Usaco2005 Nov]Ant Counting 数蚂蚁
Description 有一天,贝茜无聊地坐在蚂蚁洞前看蚂蚁们进进出出地搬运食物.很快贝茜发现有些蚂蚁长得几乎一模一样,于是她认为那些蚂蚁是兄弟,也就是说它们是同一个家族里的成员.她也发现整个 ...
- BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(dp)
题意 题目描述的很清楚... 有一天,贝茜无聊地坐在蚂蚁洞前看蚂蚁们进进出出地搬运食物.很快贝茜发现有些蚂蚁长得几乎一模一样,于是她认为那些蚂蚁是兄弟,也就是说它们是同一个家族里的成员.她也发现整个 ...
- BZOJ 2023 [Usaco2005 Nov]Ant Counting 数蚂蚁:dp【前缀和优化】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2023 题意: 有n个家族,共m只蚂蚁(n <= 1000, m <= 1000 ...
- 【bzoj2023/1630】[Usaco2005 Nov]Ant Counting 数蚂蚁 dp
题解: 水题 f[i][j] 前i种用了j个,前缀和优化就可以了
- [poj3046][Ant counting数蚂蚁]
题目链接 http://noi.openjudge.cn/ch0206/9289/ 描述 Bessie was poking around the ant hill one day watching ...
随机推荐
- 浅谈Go中的time.After
go的一条哲学是 不要通过共享来实现通信,而是通信来实现共享 多协程之间通过 channel 来实现通信,而普遍会遇到的问题是,如何进行超时控制,资料一查询,需要配置select和time.After ...
- 【Java】一个简单的Java应用程序
简单记录,Java 核心技术卷I 基础知识(原书第10 版) 一个简单的Java应用程序"Hello, World!" Hello, World! Goodbye,World! 一 ...
- ctfhub技能树—信息泄露—目录遍历
打开靶机 查看页面 点击后发现几个目录 于是开始查找 在2/1目录下发现flag.txt 成功拿到flag 练习一下最近学习的requests库 附上源码 #! /usr/bin/env python ...
- Pandas 常见操作详解
Pandas 常见操作详解 很多人有误解,总以为Pandas跟熊猫有点关系,跟gui叔创建Python一样觉得Pandas是某某奇葩程序员喜欢熊猫就以此命名,简单介绍一下,Pandas的命名来自于面板 ...
- window安装nvm
先说一下背景,最近做的两个项目一个是祖传angularjs1.X版本另一个是react hooks结合tailwindcss,前者angularjs的node版本比较低,而tailwindcss的no ...
- 关于BAPI_TRANSACTION_COMMIT一点说明
我们调用bapi做了相关的业务操作后,通常都要在后面调用 BAPI_TRANSACTION_COMMIT来提交所做得更改 然而,有时候,在程序中需要调用多个不同的BAPI实现不同的功能,那么这个时候就 ...
- 基于scrapy框架的分布式爬虫
分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...
- 使用 tke-autoscaling-placeholder 实现秒级弹性伸缩
背景 当 TKE 集群配置了节点池并启用了弹性伸缩,在节点资源不够时可以触发节点的自动扩容 (自动买机器并加入集群),但这个扩容流程需要一定的时间才能完成,在一些流量突高的场景,这个扩容速度可能会显得 ...
- HTML5与CSS3知识点总结
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 原文链接:https://blog.csdn.net/we ...
- jmeter---线程组执行顺序记录
一.默认未勾选测试计划中独立运行每个线程组时,线程组并行执行,如下,设置三个请求,每个线程组设置5秒启动5个线程. 未勾选独立运行 运行结果如下,三个线程并行执行 勾选后,一个线程组执行完后才执行下一 ...