有 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();
}
浙公网安备 33010602011771号