時間分配(dp)

2021-09-29 21:58:59 字數 1333 閱讀 5776

一共有n個房子,每個房子裡面住著乙個人,分別是庫特鴿鴿的n個迷妹。每天只有k的空閒時間。

特別地,對於迷妹i(1<=i<=n),庫特鴿鴿花費的時間必須在0到a[i](包括0和a[i])之間。

求恰好花費k時間陪n個迷妹的方案數是多少。

(答案對1e9 + 7取餘)

第一行兩個整數n,k (1<=n<=100, 0<=k<=100000)

第二行n個整數 a[i] (0<=a[i]<=k)

輸出乙個整數,代表方案數。

學長的題解:

題意分析:dp[i][j] 代表列舉到了第 i 個迷妹,當前已經用掉了 j 時間的方案數

dp[i][j] = ∑(k = 1 to k = a[i]) dp[i-1][j-k]

這樣的的複雜度是 o(nk^2),會 tle,**如下

#include

using

namespace std;

typedef

long

long ll;

const ll mod =

1e9+7;

int n,k;

int a[

100005];

ll dp[

105]

[100005];

intmain()

}}printf

("%lld\n"

,dp[n]

[k])

;return0;

}

怎麼優化?

我們發現在做 dp[i]這個維度的時候,dp[i-1]的東西是不會變的,而且對於每個 dp[i][j]有可 能算很多遍dp[i-1][j-k],於是用字首和去優化,sum[j]代表dp[i-1][0] 到dp[i-1][j-1]的和。 時間複雜度 o(nk)

(當然 i 這一維可以滾掉,但這個題沒有卡空間)

**如下

#include

using

namespace std;

typedef

long

long ll;

const ll mod =

1e9+7;

int n,k;

int a[

100005];

ll dp[

105]

[100005];

ll sum[

100005];

intmain()

printf

("%lld\n"

,dp[n]

[k])

;return0;

}

機械分配 DP

description 有n家公司來分配m臺機械,給出每一家公司用1 m臺機械分別可以做出的盈利,求出用m臺機械可以獲得的最大盈利。可以有的分公司沒有分到機械 input 第一行輸入機械數m,公司數n。接下來的m行,每一行的有n個數,第i個數表示第i個公司用第 多少行 output 輸出最大盈利。s...

DP 機器分配

總公司擁有高效生產裝置m臺,準備分給下屬的n個公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。第一行儲存兩個數,第乙個數是裝置台數m,...

機器分配 DP

題目 總公司擁有高效生產裝置m臺,準備分給下屬的n個公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不得超過總裝置數m。輸入 第一行儲存兩個數,第乙個數是...