一共有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。輸入 第一行儲存兩個數,第乙個數是...