题意:
解法:
令f[i][j]表示[1,i]层,已经选了j个的最大值,
转移方程:
f[i][j]=max(f[i][j],f[i-1][j-k]+d[i][k]).
其中d[i][k]表示第i层选k个的最大值,d[][]可以预处理.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int d[111][111];
int f[111][10000+5];
int a[111][111];
int len[111];
int n,m;
int cal(int k,int l,int r){
return a[k][l]+(a[k][len[k]]-a[k][len[k]-r]);
}
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>len[i];
for(int j=1;j<=len[i];j++){
cin>>a[i][j];
a[i][j]+=a[i][j-1];
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=len[i];j++){
for(int k=0;k<=j;k++){
d[i][j]=max(d[i][j],cal(i,k,j-k));
}
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=j&&k<=len[i];k++){
f[i][j]=max(f[i][j],f[i-1][j-k]+d[i][k]);
}
}
}
cout<<f[n][m]<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}