• 1296: [SCOI2009]粉刷匠


    1296: [SCOI2009]粉刷匠

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 916  Solved: 532
    [Submit][Status]

    Description

    windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。

    Input

    输入文件paint.in第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,'0'表示红色,'1'表示蓝色。

    Output

    输出文件paint.out包含一个整数,最多能正确粉刷的格子数。

    Sample Input

    3 6 3
    111111
    000000
    001100

    Sample Output

    16

    HINT

    30%的数据,满足 1 <= N,M <= 10 ; 0 <= T <= 100 。
    100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。

    Source

     

    题解:这个。。。再一次感天动地地没犯脑残(phile:。。。) ,好了思路——首先通过dp然后求出来对于每一层上面的状况——即对于前i个单位,刷j次可以获得多少的面积,然后直接用来玩背包问题,分组背包哦。。。详见《背包九讲》(传送门

     1 var
     2    n,m,t,ll,i,j,k,l,a1:longint;
     3    a:array[0..100of longint;
     4    b,c:array[0..100,0..10000of longint;
     5    c1:char;
     6 function max(x,y:longint):longint;inline;
     7          begin
     8               if x>y then max:=x else max:=y;
     9          end;
    10 function min(x,y:longint):longint;inline;
    11          begin
    12               if x<y then min:=x else min:=y;
    13          end;
    14 begin
    15      readln(n,m,t);
    16      for i:=1 to n do
    17          begin
    18               for j:=1 to m do
    19                   begin
    20                        read(c1);
    21                        a[j]:=a[j-1]+ord(c1)-48;
    22                   end;
    23               readln;
    24               for j:=1 to m do
    25                   for k:=1 to m do
    26                       begin
    27                            b[k,j]:=0;
    28                            for l:=0 to k-1 do
    29                                begin
    30                                     a1:=a[k]-a[l];
    31                                     b[k,j]:=max(b[k,j],b[l,j-1]+max(a1,k-l-a1))
    32                                end;
    33                       end;
    34               for j:=1 to t do
    35                   begin
    36                        a1:=min(m,j);
    37                        for k:=1 to a1 do
    38                            c[i,j]:=max(c[i,j],c[i-1,j-k]+b[m,k]);
    39                   end;
    40          end;
    41      for i:=1 to t do
    42          ll:=max(ll,c[n,i]);
    43      writeln(ll);

    44 end.      

  • 相关阅读:
    使用Linq to Sqlite 出现异常Object already attached
    CSS 嵌套DIV布局
    《面试笔记》——MySQL终结篇(30问与答)
    PotPlayer播放器下载
    博客圆的RSS怎么不能用呢
    OPC在自控系统的应用
    TAPI的使用
    刷iPAQ为Linux(zz HiPDA)
    再论软工
    Silverlight的大小自适应中存在的一个问题
  • 原文地址:https://www.cnblogs.com/HansBug/p/4192575.html
Copyright © 2020-2023  润新知