codeforces148----E. Porcelain
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int maxn = 105; 5 int s[maxn];//s[i]表示每行前i个数的和 6 int d[maxn];//d[i]表示每行取i个数时的最大价值 7 int f[10005];//限制数量为k个,往f中背,记录最大价值 8 int n,m,k; 9 int main() 10 { 11 cin >> n >> k; 12 for(int i = 1; i <= n; ++i) 13 { 14 cin >> m; 15 for(int j = 1; j <= m; ++j) 16 { 17 int x; 18 cin >> x; 19 s[j] = x + s[j-1]; 20 } 21 memset(d,0,sizeof d); 22 for(int j = 0; j <= m; ++j) 23 for(int l = 0; l <= j; ++l) 24 if(s[l]+s[m]-s[m+l-j] > d[j]) 25 d[j] = s[l] + s[m] -s[m+l-j]; 26 for(int j = k; j > 0; --j) 27 for(int l = 1; l <= min(j,m); ++l) 28 if(f[j-l]+d[l] > f[j]) 29 f[j] = f[j-l] + d[l]; 30 } 31 cout << f[k] << endl; 32 return 0; 33 }