区间dp,滚动优化
枚举大学的先后顺序,分配前j个任务给前两所大学,考虑最优分配,维护二者共同构成的最优前缀,后缀始终是个定值。
code:
#include <bits/stdc++.h>
using namespace std;
int pos[3][150005] ;
int pre[3][150005] ;
int a[3][150005] ;
void getPos(int n , int idx){
for(int i = n ; i >= 1 ; i--) pos[idx][i] = pos[idx][i+1] + a[idx][i];
}
void getPre(int n , int idx){
for(int i = 1 ; i <= n ; i++) pre[idx][i] = pre[idx][i-1] + a[idx][i];
}
int solve(int x ,int y ,int z , int n){
int pp = a[x][1] + a[y][2] ;
int ans = pp + pos[z][3] ;
for(int j = 3 ; j + 1<= n ; j++){
pp = min(pp+a[y][j],pre[x][j-1]+a[y][j]);
ans = min(ans,pp+pos[z][j+1]);
}
return ans ;
}
int main(){
//freopen("in","r",stdin);
int n ;
scanf("%d",&n);
for(int i = 0 ; i < 3 ; i++){
for(int j = 1 ; j <= n ; j++){
scanf("%d",&a[i][j]);
}
}
for(int i = 0 ; i < 3 ; i++) {
getPos(n,i);
getPre(n,i);
}
int ans = INT_MAX ;
int Order[3] = {0,1,2};
do{
int x = Order[0] , y = Order[1] , z = Order[2] ;
ans = min(ans, solve(x,y,z,n)) ;
} while (next_permutation(Order,Order+3));
cout << ans << endl ;
return 0 ;
}