首先先预处理每行刷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.
04-28 00:49