統計螞蟻 ants DP

2021-10-23 15:31:02 字數 1527 閱讀 3762

>description

螞蟻山上有t(1<=t<=1,000)種螞蟻,標記為1…t,每種螞蟻有n_i只螞蟻(1<=n_i<=100),現有a(a<=5000)只螞蟻,從中選出s,s+1,…,b(1<=s<=b<=a)只螞蟻一共有多少種選法?

如有5只螞蟻分別為,一共有3種螞蟻,每一種螞蟻的數量分別為2,2,1,以下是選不同數量螞蟻的方法:

1個螞蟻3種選法:

2個螞蟻5種選法:

3個螞蟻5種選法:

4個螞蟻3種選法:

5個螞蟻1種選法:

你的任務是從中選s…b只螞蟻的方法總和。

>input

第一行: 4個空格隔開的整數: t, a, s和b;

第2到a+1行:每行乙個整數表示螞蟻的種類。

>output

輸出從a只螞蟻中選出s…b只螞蟻的方法數,答案保留後6位。

對於30%的資料:t<=30,a<=100;

對於50%的資料:t<=100,a<=400;

對於100%的資料:t<=1000,a<=5000;

>解題思路

一道dp題

設f [i

][j]

f[i][j]

f[i][j

]為前i

ii種螞蟻選j

jj只的總方案

我們只需預處理乙個桶,記錄第i

ii種螞蟻的總數

很容易得出狀態轉移方程:

f [i

][j]

=σf[

i−1]

[j−(

0t[i

])

]f[i][j]=σf[i-1][j-(0 ~ t[i])]

f[i][j

]=σf

[i−1

][j−

(0t[

i])]

(默默列舉第i種螞蟻選多少只,因為答案求的只是組合數)

我們又會發現這是乙個熟悉的字首和優化,所以我們再預處理一下字首和就可以了(雖然我沒有預處理字首和就過了,不過我還是打了一下字首和)

>**

#include 

#include

#include

#define p 1000000

#define n

5005

using namespace std;

int t, n, a, b, s[

1005

], f[

1005][

n], sum[

1005][

n], ans;

int main()

}printf

("%d"

,(p + sum[t]

[b]- sum[t]

[a -1]

)% p)

;return0;

}

懶螞蟻精神

今天讀到一篇文章,是關於懶螞蟻的,文章是這樣說的 什麼是懶螞蟻呢?在成群的螞蟻中,大部分螞蟻都是在爭先恐後地尋找食物 搬運食物的,可以說是相當勤勞。但有少數螞蟻則整日東看看,西望望,似乎無所事事,什麼活也不幹,它們就是懶螞蟻。那麼這些懶螞蟻在螞蟻隊伍中有什麼作用呢?科學家們做了下面的實驗 他們在這些...

螞蟻的故事

老婆生活記錄 螞蟻是地球上最常見的昆蟲,數量最多的昆蟲種類。螞蟻好小,只有幾公釐,乙隻螞蟻的重量只有 0.005 克,很多動畫片裡都有它的身影,百威啤酒的廣告也讓小小螞蟻變成了最可愛的小東西,對這樣的乙個小可愛,你會怕它嗎?今天,閒暇之餘對幾個朋友做了乙個小小的調查,問他們是否怕螞蟻?片刻,朋友們的...

螞蟻問題(演算法)

有一根27厘公尺的細木桿,在第3厘公尺 7厘公尺 11厘公尺 17厘公尺 23厘公尺這五個位置上各有乙隻螞蟻。木桿很細,不能同時通過乙隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘公尺的距...