http://poj.org/problem?id=1976
(1)有n节火车,用3个火车头去拉动,每个火车头拉动的车厢是连续的,且上限为m,求最大的载客量。
(2)核心的部分:
f[i][j]=max(f[i-1][j], f[k][j-1]+a[i]-a[k]);
f[i][j]表示拉动前 i 节车厢由 j 个火车头拉动的最优解,a[i]是经由:
a[i]+=a[i-1];
处理过的,表示还不是特别理解。。。
具体代码:
View Code
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int f[52000][4],a[52000]; int i, j, k, n, m, t; int main() { scanf("%d", &t); while(t--) { scanf("%d", &n); a[0]=0; for(i=1;i<=n;i++) { scanf("%d", &a[i]); a[i]+=a[i-1]; } scanf("%d", &m); for(i=0;i<=n;++i) for(j=0;j<4;++j) f[i][j]=0; for(i=1;i<=n;++i) for(j=1;j<4;++j) { k=i-m; if(k<0) k=0; f[i][j]=max(f[i-1][j], f[k][j-1]+a[i]-a[k]); } printf("%d\n", f[n][3]); } return 0; }