满脑子组合数学,根本没想到dp 设f[i][j]为前i只蚂蚁,选出j只的方案数,初始状态为f[0][0]=1 转移为 \[ f[i][j]=\sum_{k=0}^{a[i]}f[i-1][j-k] \] \[ f[i][j]=\sum_{k=max(j-a[i],0)}^{j}f[i-1][k] \] 这样显然时空都不行,用滚动数组优化空间,前缀和优化时间即可 #include<iostream> #include<cstdio> using namespace std; cons…
http://www.lydsy.com/JudgeOnline/problem.php?id=1630 题意,给你n种数,数量为m个,求所有的数组成的集合选长度l-r的个数 后两者待会写.. 裸dp其实应该会tle的额,但是数据弱? d[i][j]表示前i种j长度的数量 d[i][j]=sum{d[i-1][j-k]} 1<=k<=a[i] 会爆mle.但是发现这是裸动态数组.. 注意顺序即可 #include <cstdio> #include <cstring>…
题目链接:戳这里 题意:有A只蚂蚁,来自T个家族,每个家族有ti只蚂蚁.任取n只蚂蚁(S <= n <= B),求能组成几种集合? 这道题可以用dp或母函数求. 多重集组合数也是由多重背包问题拓展出来的一类经典问题,而此类问题也都可以用母函数求. 给大家讲2种方法: ①朴素方法: 状态:dp[i][j]:前i种中选j个可以组成的集合数 决策:第i种选k个,k<=cnt[i] && j-k>=0 转移:dp[i][j]=Σdp[i-1][j-k] 复杂度为O(B*Σa…
[BZOJ1630/2023][Usaco2007 Demo]Ant Counting 题意:T中蚂蚁,一共A只,同种蚂蚁认为是相同的,有一群蚂蚁要出行,个数不少于S,不大于B,求总方案数 题解:DP,先列出朴素的方程,用f[i][j]表示前i种,出行j只的方案数,v[i]代表第i中蚂蚁的个数 f[i][j]=∑f[i-1][j-k] (0≤k≤min(j,v[i])) 也可以表示为 f[i][j]=∑f[i-1][k] (j-min(j,v[i])≤k≤j) 发现时间复杂度为均摊O(A^2),…
bzoj2023[Usaco2005 Nov]Ant Counting 数蚂蚁&&bzoj1630[Usaco2007 Demo]Ant Counting 题意: t个族群,每个族群有ni只蚂蚁,同族群蚂蚁没有区别.问从所有蚂蚁中选出s到b只蚂蚁有多少方案.t≤1000,ni≤100. 题解: dp,f[i][j]表示考虑第i个族群,剩下j只蚂蚁没选择.则f[i][j]=sum(f[i-1][j-k]),k=0..min(j,n[i]).然而O(n^3)会超时,注意到可以计算f[i-1][…
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1630 http://www.lydsy.com/JudgeOnline/problem.php?id=2023 [题解] 直接dp,f[i,j]表示第i个种族选了j只蚂蚁的方案数,转移枚举这个种族选择的方案. 然后可以前缀和+滚动数组 # include <stdio.h> # include <string.h> # include <iostream> # i…
Description Bessie was poking around the ant hill one day watching the ants march to and fro while gathering food. She realized that many of the ants were siblings, indistinguishable from one another. She also realized the sometimes only one ant woul…
还以为是dp呢 首先默认答案是n 对于一个影子,如果前边的影子比它高则可以归进前面的影子,高处的一段单算: 和他一样高的话就不用单算了,ans--: 否则入栈 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=50005; int n,m,ans,top,h[N],s[N]; int read() { int r=0,f=1; char p=g…
仿佛学到了贪心的新姿势-- 考虑相邻两头牛,交换它们对其他牛不产生影响,所以如果交换这两头牛能使这两头牛之间的最大值变小,则交换 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=50005; int n,ans=-1e9,sum[N]; struct qwe { int x,y; }a[N]; inline bool cmp(const qw…
题目链接:BZOJ - 1801 题目分析 对于50%的数据是可以直接状压 DP 的. 对于100%的数据,使用递推的 DP .(或者这只叫递推不叫 DP ?) 可以发现,每一行和每一列的棋子个数不能超过 2 个. 用 f[i][j][k] 表示前 i 行,有 j 列有 1 个棋子,有 k 列有 2 个棋子的方案数.(有 0 个棋子的列数可以用 m - j - k 得到.) 初始状态 f[0][0][0] = 1: 转移时从第 i - 1 行转移过来,由于一行最多放 2 个棋子,所以可以讨论各种…