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; }