codeforces148----E. Porcelain

时间:2024-10-13 09:36:08
 #include <iostream>
#include <cstring>
using namespace std;
const int maxn = ;
int s[maxn];//s[i]表示每行前i个数的和
int d[maxn];//d[i]表示每行取i个数时的最大价值
int f[];//限制数量为k个,往f中背,记录最大价值
int n,m,k;
int main()
{
cin >> n >> k;
for(int i = ; i <= n; ++i)
{
cin >> m;
for(int j = ; j <= m; ++j)
{
int x;
cin >> x;
s[j] = x + s[j-];
}
memset(d,,sizeof d);
for(int j = ; j <= m; ++j)
for(int l = ; l <= j; ++l)
if(s[l]+s[m]-s[m+l-j] > d[j])
d[j] = s[l] + s[m] -s[m+l-j];
for(int j = k; j > ; --j)
for(int l = ; l <= min(j,m); ++l)
if(f[j-l]+d[l] > f[j])
f[j] = f[j-l] + d[l];
}
cout << f[k] << endl;
return ;
}