求助,代码调了一整天,样例过了,但是就是过不了……思路是分组背包。
//CF148E
//2022.1.5 9:32 13:33
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=105;
int v[maxn][maxn],sum[maxn][maxn];
int dp1[maxn][maxn],dp2[maxn][10005];//105
int num[maxn];
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main()
{
int n,m;
n=read();m=read();
for(int i=1;i<=n;i++)
{
num[i]=read();
for(int j=1;j<=num[i];j++)
{
v[i][j]=read();
sum[i][j]+=sum[i][j-1]+v[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=num[i];j++)
{
for(int k=0;k<=j;k++)
{
int l=j-k;//i k l
int s=sum[i][num[i]]-sum[i][num[i]-l]+sum[i][k];
//cout<<dp1[i][j]<<" ";
dp1[i][j]=max(dp1[i][j],s);
//cout<<dp1[i][j]<<endl;
}
}
}
for(int i=1;i<=n;i++)
{
//cout<<i<<endl;
for(int j=0;j<=m;j++)
{
//cout<<j<<endl;
for(int k=0;k<=num[i]&&k<=j;k++)
{
dp2[i][j]=max(dp2[i][j],dp2[i-1][j-k]+dp1[i][k]);
//cout<<dp2[i][j]<<endl;
}
}
}
cout<<dp2[n][m]<<endl;
return 0;
}