首先先预处理每行刷1~m次最多能正确涂出多少格
然后把每行涂色看做一个物品,当重量为j(这行涂了j次),价值为对应能正确涂出的格子数;
总重量为k,然后做分组背包即可
var f:array[..,..,..] of longint;
sum:array[..,..] of longint;
dp:array[..,..] of longint;
t,x,p,n,m,k,l,i,j:longint;
s:string; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; begin
readln(n,m,t);
for i:= to n do
begin
readln(s);
l:=length(s);
for j:= to l do
begin
x:=ord(s[j])-;
sum[i,j]:=sum[i,j-]+x;
end;
end;
for i:= to n do
begin
for j:= to m do
begin
f[i,j,]:=;
for k:= to j do
begin
for l:=j- downto do
begin
p:=sum[i,j]-sum[i,l];
f[i,j,k]:=max(f[i,j,k],f[i,l,k-]+max(p,j-l-p));
end;
end;
end;
end;
for i:= to n do
begin
for j:=t downto do
begin
for k:= to m do
if j-k>= then dp[i,j]:=max(dp[i,j],dp[i-,j-k]+f[i,m,k])
else break;
end;
end;
writeln(dp[i,t]);
end.