zoukankan      html  css  js  c++  java
  • 舞台设置 (Standard IO)

    题意/Description:

            游乐园决定在一个n×m的广场上举办一次颁奖晚会,总管要你帮忙搭建一个舞台。
    现在给你广场的布置图(规定地图的上方为正北),有些位置需要布置为观众席(记为1),另一些是空地(记为0)。舞台只能在空地上搭建。
    为了使晚会更加吸引人,平平觉得舞台应该是朝北的h—金字塔形。h—金字塔形舞台是由h个矩形舞台相接而成的,其中后方的矩形舞台的两端必须超出在其前面的矩形舞台,且最小矩形面对的朝向为舞台的方向。下面给出几个实例:

           舞台的面积应该尽量大,输出面积最大的朝北h—金字塔形舞台的面积。

     

    读入/Input

           第一行3个整数 n、m、h。
           接下来n行,每行m个0或1,中间用一个空格隔开。

     

    输出/Output

           一个整数,表示最大的朝北的h—金字塔形舞台的面积。
           如果没有符合题意的h—金字塔形舞台输出0。

     

    题解/solution

           明显的动态规划。
      f[i,h,x,y]表示以第i行下标为x,y的边为舞台底边且层数最大的h-舞台的面积。
      g[i,h,x,y]表示以第i行下标在x,y以内的边为舞台底边且层数最大的h-舞台的面积。即: 
      如此表示状态,不难得到转移方程:
      g[i,h,x,y]=Max{g[i,h,x,y-1],g[i,h,x+1,y],f[i,h,x+1,y-1]}
      当第i行从x至y均为0时:
      f[i,h,x,y]=Max{f[i-1,h,x,y],g[i-1,h-1,x,y]}+y-x+1
      否则:
      f[i,h,x,y]=0
      考虑到空间为O(N3h)太大了,故可将行数滚动。本题即可完美解决。

     

    代码/Code

    var
      f,c:array[0..1,0..21,0..101,0..101] of longint;
      a:array[0..101,0..101] of longint;
      n,m,h,ans:longint;
    procedure init;
    var
      i,j:longint;
    begin
      readln(n,m,h);
      for i:=1 to n do
        for j:=1 to m do
          begin
            read(a[i,j]);
            a[i,j]:=a[i,j]+a[i,j-1];
          end;
    end;
    
    function max(o,p:longint):longint;
    begin
      if o>p then exit(o);
      exit(p);
    end;
    
    procedure main;
    var
      i,j,x,y,t:longint;
    begin
      t:=0;
      for i:=1 to n do
        begin
          t:=1-t;
          for j:=1 to h do
            if j<=i then
              begin
                for x:=m downto 1 do
                  begin
                    for y:=x to m do
                      begin
                        if y-x+1>=3 then
                          c[t,j,x,y]:=max(f[t,j,x+1,y-1],max(c[t,j,x+1,y],c[t,j,x,y-1]));
                        if (a[i,y]-a[i,x-1]=0) and ((j=1) or (c[1-t,j-1,x,y]>0)) then
                          begin
                            f[t,j,x,y]:=max(f[1-t,j,x,y],c[1-t,j-1,x,y])+y-x+1;
                            if h=j then ans:=max(ans,f[t,j,x,y]);
                          end else f[t,j,x,y]:=0;
                      end;
                  end;
              end;
        end;
    end;
    
    begin
      init;
      main;
      write(ans);
    end.
    



  • 相关阅读:
    Pandas 中对列 groupby 后进行 sum() 与 count() 区别及 agg() 的使用方法
    数据预处理 | python 第三方库 imblearn 处理样本分布不均衡问题
    数据预处理 | 使用 pandas.to_datetime 处理时间类型的数据
    CSS自定义文件上传按钮样式,兼容主流浏览器
    php实现计划任务
    windows环境下为php打开ssh2扩展
    vmware上linux连网(centos6.3、ubuntu14测试通过)
    如何实现打开网页自动弹出QQ对话框
    php输出最近N个月的起至时间戳
    内部div自动扩张剩余宽度(包含固定宽度div和自适应宽度div)
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9319633.html
Copyright © 2011-2022 走看看