zoukankan      html  css  js  c++  java
  • POJ Ant Counting DP

    dp[i][j]表示前i种蚂蚁组成元素个数为j的集合有多少种。

    则dp[i][j] = dp[i-1][j] + dp[i-1][j-1] + ... + dp[i-1][ max(0,j-a[i])];

    直接算的话复杂度为O(TA^2)

    状态的转移是一个区间内的数的和,所以再用一个数组f[i][j]记录dp[i][j]的前缀和。

    dp[i][j] = f[i-1][j]-f[i-1][j-a[i]-1];

    复杂度为O(TA)

    同时可以用滚动数组优化空间复杂度。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    const int maxn = 110005;
    const int mod = 1000000;
    int dp[maxn];
    int da[1005];
    int f[maxn];
    int n,A,a,b;
    int main()
    {
        while( scanf("%d%d%d%d", &n, &A, &a, &b) != EOF)
        {
            memset(da,0,sizeof(da));
            for(int i = 1;i <= A; i++)
            {
                int x; scanf("%d", &x);
                da[x]++;
            }
            dp[0]=1;
            f[0]=1;
            int maxv=0;
            for(int i = 1; i <= n; i++)
            {
                maxv += da[i];
                for(int i=0;i<=maxv;i++)
                    f[i]=(f[i-1]+dp[i])%mod;
                for(int j=1; j <= min(b,maxv); j++)
                {
                    dp[j]=(f[j]-(j-da[i]<=0?0:f[j-da[i]-1]))%mod;
                }
            }
            int res=0;
            for(int i=a;i<=b;i++)
                res=(res+dp[i])%mod;
            printf("%d
    ",res);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    flushdb()
    del()
    删除匹配某个pattern的一组键
    I函数
    字段映射
    maven技术(一)软件安装与配置
    jQuery监听事件经典例子
    IE中调试JS的一款很好的工具
    技术大牛是如何拿到国内IT巨头offer的?
    bzoj2124 等差子序列(hash+线段树)
  • 原文地址:https://www.cnblogs.com/BMan/p/3680709.html
Copyright © 2011-2022 走看看