对于每一个数,它1.可以自己单独一个段,2.也可以本来就已经有段,然后再加入这一个段
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std ;
const int N = 1e5 +10 ;
typedef long long LL ;
LL f[N][210] ; // 前n个数分成j段的最小值
LL a[N] , p[N] ;
LL n , k ;
int main(){
cin >> n >> k ;
for(int i = 1 ; i <= n ; i ++) cin >> a[i] ;
for(int i = 1 ; i <= k ;i ++) cin >> p[i] ;
memset(f,128,sizeof(f)) ;
f[0][0] = 0 ;
for(int i = 1 ; i <= n ; i ++){
for(int j = 1 ; j <= k ; j ++){
f[i][j] = max(f[i][j], f[i-1][j]+ a[i] * p[j] ) ;
f[i][j] = max(f[i][j],f[i-1][j-1] + a[i]*p[j] ) ;
}
}
cout << f[n][k] << endl ;
}