当前位置: 首页 > news >正文

【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 }

 

转载于:https://www.cnblogs.com/konjak/p/6003443.html

相关文章:

  • 数据获取以及处理系统 --- 功能规格说明书
  • 【JAVA】设计模式之懒汉式与恶汉式的单例模式实现的方法与详解
  • asp.net定时任务
  • 14. Html5的局:WebGL的纹理格式
  • Tomcat编译jsp生成Servlet文件的存放位置
  • Android事件总线(三)otto用法全解析
  • 反思总结然后整装待发
  • 当SetTimeout遇到了字符串
  • ABP文档 - EntityFramework 集成
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • 查看linux服务器的系统信息
  • sql事务、视图和索引
  • 谈谈springmvc的ResponseBodyAdvice
  • C语言之从内存角度理解不同类型的变量
  • Android 利用线程运行栈StackTraceElement设计Android日志模块
  • JavaScript-如何实现克隆(clone)函数
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Java超时控制的实现
  • Redux系列x:源码分析
  • 马上搞懂 GeoJSON
  • 手写双向链表LinkedList的几个常用功能
  • 问题之ssh中Host key verification failed的解决
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 自制字幕遮挡器
  • 走向全栈之MongoDB的使用
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • postgresql行列转换函数
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # Panda3d 碰撞检测系统介绍
  • #DBA杂记1
  • (八)c52学习之旅-中断实验
  • (二)fiber的基本认识
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)nsfocus-绿盟科技笔试题目
  • (转)重识new
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 8.0 发布到 IIS
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Standard 的管理策略
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET大文件上传知识整理
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /etc/fstab 只读无法修改的解决办法
  • /etc/skel 目录作用
  • [ Linux ] Linux信号概述 信号的产生
  • [1] 平面(Plane)图形的生成算法
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [android]-如何在向服务器发送request时附加已保存的cookie数据