题意: 解法: 令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){//第k层左边取l个右边取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]; } } //预处理d[i][j]表示i层取j个的最大值 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)); } } } //dp计算f[i][j]表示[1,i]层已经取了j个的最大值 for(int i=1;i<=n;i++){ for(int j=0;j<=m;j++){ for(int k=0;k<=j&&k<=len[i];k++){//枚举在第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; }