POJ 3046 Ant Counting 动态规划

POJ 3046 Ant Counting 动态规划

思路:

f[a][b] = { 种类数目为 a,蚂蚁数目为 b 时候的方案总数 }
转移:
f[a][b] = f[a - 1][0] + f[a - 1][1] + ... + f[a - 1][b]

时间 O(AT) 如果求 f[a][*] 只用一次循环的话
可以用循环数组

杯具:
把i看成j了,足足调了3个小时,注意,是不吃不喝,也没有上厕所,没有听歌,没有看优酷。。
是精神高度集中地浪费了3个小时!
与非主流之脑残相比,有过之而无不及也。

#include  < stdio.h >

#define  P 1000000

int  T, A, S, B, fam[ 1024 ], dp[ 2 ][ 1024 * 128 ],  * cur,  * pre;

inline 
int  min( int  a,  int  b)
{
    
return a < b ? a : b;
}


int  main()
{
    
int i, j, cnt, end, sum;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d%d%d%d"&T, &A, &S, &B);
    
for (i = 0; i < A; i++{
        scanf(
"%d"&j);
        fam[j]
++;
    }

    
    
for (i = 0; i <= fam[1]; i++)
        dp[
1][i] = 1;
    end 
= fam[1];

    
for (i = 2; i <= T; i++{
        cur 
= dp[i & 1];
        pre 
= dp[(i+1& 1];
        cur[
0= pre[0];
        end 
+= fam[i];
        
for (j = 1; j <= end; j++{
            cur[j] 
= cur[j - 1+ pre[j];
            
if (j > fam[i])
                cur[j] 
-= pre[j - fam[i] - 1];
            cur[j] 
+= P;
            cur[j] 
%= P;
        }

    }


    sum 
= 0;
    
for (i = S; i <= B; i++{
        sum 
+= cur[i];
        sum 
%= P;
    }


    printf(
"%d\n", sum);

    
return 0;
}

你可能感兴趣的:(POJ 3046 Ant Counting 动态规划)