dp百題進度條[1/100]數組
一列火車有一個火車頭拖着一長串的車箱,每一個車箱有若干個乘客。
一旦火車頭出了故障,全部的車箱就只能停在鐵軌上了,所以鐵路局給每列火車配備了三個迷你火車頭,每一個迷你火車頭能夠拖動必定數量的車箱,以便火車頭髮生故障後可以拖走部分車箱。
鐵路部門對迷你火車頭做了以下規定:
1.迷你火車頭可以拖動的最大車箱數是肯定的,這個數量對三個迷你火車頭都是相同的。
2.一旦火車頭髮生故障,迷你火車頭要拖走儘量多的旅客,每節車箱的旅客數事先是已知的,而且旅客不得隨意更換車箱。
3.一個迷你火車頭拖走的車箱必須是連續的,全部車箱從1開始編號。
假若有7節車箱,一個迷你火車頭最多能夠拖動二節車箱,1到7號車箱中的旅客人數分別爲35,40,50,10,30,45和60。
若是三個迷你火車頭拖走的車箱分別是1-2,3-4和6-7,它們帶走的旅客總數將達到240人,其它任何方案都不可能超過該數,因此240就是這個問題的解。
給定車箱數,每節車箱的旅客人數和一個迷你火車頭能拖動的最大車箱數,寫一個程序求出三個迷你火車頭最多能帶走的旅客數。測試
輸入格式
輸入文件共有三行。
第一行爲一個正整數n,其中n<=50,000,表示車箱總數;
第二行爲n個用空格隔開的整數,依次表示n節車箱的旅客人數,每節車箱人數不超過100;
第三行爲一個正整數m表示迷你火車頭可以拖動的最大車箱數,其中m<=n/3。spa
輸出格式
輸出文件僅有一行包含一個整數表示三個迷你火車頭最多能帶走的旅客數。
1
測試樣例1
輸入
7
35 40 50 10 30 45 60
2code
輸出
240string
咱們定義dp[i][j]爲第i個火車頭時,拖了前j個車箱的最大值
咱們用front數組來存前綴
狀態轉移方程
dp[i][j] = max_(dp[i][j - 1],dp[i - 1][j - m] + front[j] - front[j - m]);it
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 50000 + 5; int n,t,m; int dp[5][MAXN],train[MAXN],front[MAXN]; int max_(int x,int y){ if (x > y) return x; else return y; } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); for (register int i = 1 ; i <= n ; i++) scanf("%d",&train[i]),front[i] = front[i - 1] + train[i]; scanf("%d",&m); for (register int i = 1 ; i <= 3 ; i++){ for (int j = m ; j <= n ; j++){ dp[i][j] = dp[i][j - 1]; dp[i][j] = max_(dp[i][j - 1],dp[i - 1][j - m] + front[j] - front[j - m]); } } printf("%d\n",dp[3][n]); } return 0; }