poj 3046
2015-09-10 20:58
381 查看
我们用dp[i][j]来代表前i种蚂蚁所能组成规模为j 的蚁群的方法数,那么转移方程应该是
dp[i][j] = (dp[i][j]+dp[i-1][j-k]) 0<=k< N[i] N[i]为第i种蚂蚁的个数,用文字来说,就是前i种蚂蚁组成规模为j的蚁群方法数是由
前i-1种蚂蚁组成j-k种转移过来的,至于j,它为当前蚁群的总数。
而i为1000,j最大为100000,直接开会MLE,我们观察发现,dp[][]的第一维只用到了i和i-1,所以我们可以用滚动数组来求。
dp[i][j] = (dp[i][j]+dp[i-1][j-k]) 0<=k< N[i] N[i]为第i种蚂蚁的个数,用文字来说,就是前i种蚂蚁组成规模为j的蚁群方法数是由
前i-1种蚂蚁组成j-k种转移过来的,至于j,它为当前蚁群的总数。
而i为1000,j最大为100000,直接开会MLE,我们观察发现,dp[][]的第一维只用到了i和i-1,所以我们可以用滚动数组来求。
#include<stdio.h> #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<iomanip> #include<vector> #include<time.h> #include<queue> #include<stack> #include<iterator> #include<math.h> #include<stdlib.h> #include<limits.h> #include<map> #include<set> #include<bitset> //#define ONLINE_JUDGE #define eps 1e-8 #define INF 0x7fffffff #define FOR(i,a) for((i)=0;i<(a);(i)++) #define MEM(a) (memset((a),0,sizeof(a))) #define sfs(a) scanf("%s",a) #define sf(a) scanf("%d",&a) #define sfI(a) scanf("%I64d",&a) #define pf(a) printf("%d\n",a) #define pfI(a) printf("%I64d\n",a) #define pfs(a) printf("%s\n",a) #define sfd(a,b) scanf("%d%d",&a,&b) #define sft(a,b,num) scanf("%d%d%d",&a,&b,&num) #define for1(i,a,b) for(int i=(a);i<b;i++) #define for2(i,a,b) for(int i=(a);i<=b;i++) #define for3(i,a,b)for(int i=(b);i>=a;i--) #define MEM1(a) memset(a,0,sizeof(a)) #define MEM2(a) memset(a,-1,sizeof(a)) #define ll __int64 const double PI=acos(-1.0); template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} template<class T> inline T Min(T a,T b){return a<b?a:b;} template<class T> inline T Max(T a,T b){return a>b?a:b;} using namespace std; //#pragma comment(linker,"/STACK:1024000000,1024000000") int n,m; #define M 110 #define N 1000010 #define Mod 1000000000 #define p(x,y) make_pair(x,y) const int MAX_len=550; int dp[2][100010]; int fa[1010]; int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif int T,A,S,B; while(scanf("%d%d%d%d",&T,&A,&S,&B)!=EOF){ int x; for(int i=0;i<A;i++){ sf(x); fa[x]++; } memset(dp,0,sizeof dp); dp[0][0]=1; int total=0; for(int i=1;i<=T;i++){ total += fa[i]; //total为当前的蚂蚁总数 int cur = i&1; int pre = (i-1)&1; memset(dp[cur],0,sizeof dp[cur]); for(int k=0;k<=fa[i];k++){ for(int j=total;j>=k;j--){ dp[cur][j] = (dp[cur][j]+dp[pre][j-k])%1000000;//状态转移方程 } } } int cur = T&1; int ans=0; for(int i=S;i<=B;i++){ ans = (ans+dp[cur][i])%1000000; //计算总的规模在S和B之间的蚁群总数 } pf(ans); } return 0; }
相关文章推荐
- MySql中时间类型总结
- 数据挖掘和机器学习的区别与联系
- iOS之学习系统提供的框架(库)和自己制作框架
- poj1611 The Suspects
- Android 多渠道打包方案问题记录及解决方案
- 动态规划小结
- MySQL 1040 错误 Too many connections解决方案
- jenkins 通过shell启动java应用程序会随着job完成而被自动关闭的解决方法
- 简单计算器
- Android0824<六>(CheckBox,ListView)
- 彻底搞定二分图的匈牙利算法,最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖
- 教训啊,生成.o文件的代码是绝对不能去调用生成.ko文件的函数变量的
- 0909 随说
- C++_递归排列产生器
- android Json详解
- Qt Creator设置快捷键
- Android0821<五>(TextView、EditText、Button)
- Visual Studio 2015正式版/产品密钥
- 数组、链表、堆栈和队列
- Leetcode:Combinations 组合