对于每一个数,它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 ; }