洛谷
acwing
#include <bits/stdc++.h>
#define x first
#define y second
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef pair<int,int> PII;
typedef pair<char,int> PCI;
typedef long long LL;
typedef unsigned long long ULL;
const int N=50+10 ,M= N * N + 10, INF = 0x3f3f3f3f ,mod =1e9 + 7 ;
int n,m,k;
char c[N];
int w[N][N],s[N],f[M];
void solve()
{
cin>>n>>m>>k;
for(int i=0;i<n;i++) // 读入每块木板
{
memset(w,0,sizeof w);
cin>>c+1;
// 蓝色 ->1 红色 ->0
for(int i=1;i<=m;i++ ) s[i] = s[i-1] + c[i] -'0';
//w[i][j] 长度为i的段 粉刷j次的最大收益
for(int i=1;i<=m;i++)
for(int j=1;j<=i;j++)
for(int k=0;k<i;k++)
{
int blue = s[i] -s[k]; // [k+1,i] 都涂成蓝色的 收益
int red = i - k - blue;// [k+1,i] 都涂成红色的 收益
// 1...k+[k+1,i]
w[i][j] = max(w[i][j],w[k][j-1] + max(blue,red));
}
for(int j=k;j>=0;j--)
for(int cnt=1;cnt<=m && cnt <= j ;cnt ++ )
// if(j>=cnt)
f[j] = max(f[j],f[j-cnt] + w[m][cnt]);
}
cout << f[k] <<endl;
}
int main()
{
ios
int T=1;
// cin>>T;
while(T -- )
{
solve();
}
return 0;
}