zoukankan      html  css  js  c++  java
  • 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.      

  • 相关阅读:
    第1章 初涉MySQL
    成绩转换
    【JSTL】--附加:c:import,c:url;c:param,c:redirect--drp217
    【JSTL】--JSTL表达式:c:forEach,varstatus/begin end/循环控制标签--drp215
    【JSTL】--JSTL表达式:c:forEach--drp215
    【JSTL】--JSTL表达式:c:set,c:if,c:choose,--drp214
    【JSTL】--c:out演示--drp213
    【JSTL】--测试EL表达式--drp212~
    【JSTL】--读取实体成员变量吗?--drp212
    【JSTL】--测试EL表达式--drp212
  • 原文地址:https://www.cnblogs.com/HansBug/p/4192575.html
Copyright © 2011-2022 走看看