继续简单的背包入门题,原谅我当时的无知。
代码里面重要部分都有注释。
#include<cstdio> #include<iostream> #include<cstring> using namespace std; #define N 50100 int a[N]; int dp[4][N]; int b[N]; int main() { int n; cin >> n; while(n--) { int m; cin >> m; int sum = 0; for(int i=1; i<=m; ++i) {cin >> a[i]; sum += a[i]; } int t; cin >> t;//t是其长度; int g = m-t+1; memset(b,0,sizeof(b)); if(t*3 >= m) { cout << sum <<endl; continue; } for(int i=1; i<=t; ++i) for(int j=1; j<=g; ++j) b[j] += a[i+j-1]; for(int i=0; i<=g; ++i) dp[0][i] = 0;//d[i][j] i表示已经给几个车头装上了车厢, j表示第i个车头的装的是从j开始的车厢。 for(int i=1; i<=3; ++i) for(int j=t*(i-1)+1; j<=g-(3-i)*t; ++j ) { if(i == 1) dp[i][j] = b[j]; else {//j = 5, j = 6; dp[i][j] = dp[i-1][j-t] + b[j]; for(int k=(i-2)*t+1; k < j-t; ++k) if(dp[i-1][k] + b[j] > dp[i][j]) dp[i][j] = dp[i-1][k] + b[j]; } } int ma = 0; for(int j=t*2+1; j<=g; ++j) if(ma < dp[3][j]) ma = dp[3][j]; cout << ma<<endl; } return 0; }