有 n 组序列,第 i 组有 ki个元素,每次可以随机选一组拿掉其目前最左边或最右边的元素,
问 取了m 次后,的最大价值和。
#include <iostream> #include <cstring> #include <vector> using namespace std ; const int M= 1e4+2; int n,m,f[102][M],a[102][M],v[102][M]; int sum[102][M],L[102]; void solve(){ int i,j,k; for(i=1;i<=n;i++) for(j=m;j>=0;j--) for(k=0;k<=L[i];k++) if(k<=j) f[i][j] =max(f[i][j], f[i-1][j-k]+v[i][k]); cout<<f[n][m]<<'\n'; } signed main(){ int i,j; cin>>n>>m; for(i=1;i<=n;i++){ cin>>L[i]; for(j=1;j<=L[i];j++) cin>>a[i][j],sum[i][j]=sum[i][j-1]+a[i][j]; for(j=1;j<=L[i];j++) for(int y=0;y<=j;y++) v[i][j]=max(v[i][j], sum[i][y]+sum[i][L[i]]-sum[i][L[i]-j+y]); } solve(); }