zoukankan      html  css  js  c++  java
  • 敲砖块(codevs 1257)题解

    【问题描述】

    在一个凹槽中放置了 n 层砖块、最上面的一层有n 块砖,从上到下每层依次减少一块砖。每块砖
    都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示。
    14 15 4 3 23
     33 33 76 2
       2 13 11
        22 23
          31
    如果你想敲掉第 i 层的第j 块砖的话,若i=1,你可以直接敲掉它;若i>1,则你必须先敲掉第
    i-1 层的第j 和第j+1 块砖。
    你现在可以敲掉最多 m 块砖,求得分最多能有多少。

    【样例输入】

       4 5
       2 2 3 4
       8 2 7
       2 3
       49

    【样例输出】

        19

    【解题思路】

     本题为湖南省选2004day2的题,初看题目感觉并不好做,然而看了样例之后,我们可以发现一些很神奇的事情……样例是把倒三角变成一个倒直角三角,于是,我们可以清晰地发现,若要打第i列的第j个砖块,那么必须至少打掉第i+1列的前j-1个砖块以及第i列的前j-1个砖块,因为第i列的前j-1个砖块我们可以循环得出,因此设现在需要打第i列的第j个砖块,总共打了k个砖块,f[i,j,k]就表示这种状态下的最大值。因此我们可以发现,f[i,j,k]只与f[i+1,l,k-j]有关,l为>=j-1的数,用最大的f[i+1,l,k-j]加上这一列上从第1个到第j个得分即可,那么DP方程就出来了,然后再看看题目数据范围,可以做DP,时间复杂度为O(n^3*m)需要注意几点:由于i与i+1有关,因此我们把i倒过来循环会好一些,其次j要从0开始循环,例如样例,当你要打第一列第二个时,你可以选择打第一列第一个,第二列第一个,和第四列第一个,这样第三列就是0了。26行代码,应该是省选题目中代码最短的了……

    【代码实现】

     1 var a:array[0..55,0..55] of longint;  
     2     i,j,n,m,k,l,max:longint;  
     3     f:array[-1..55,-1..55,-1..1300] of longint;  
     4 begin  
     5  readln(n,m);  
     6  for i:=1 to n do  
     7   for j:=1 to n-i+1 do  
     8    read(a[i,j]);  
     9  for i:=n downto 1 do  
    10   for j:=0 to n-i+1 do  
    11    for k:=2*j-1 to m do  
    12     begin  
    13      max:=0;  
    14      for l:=j-1 to n-i+1 do  
    15       if f[i+1,l,k-j]>max then  
    16        max:=f[i+1,l,k-j];  
    17      f[i,j,k]:=max;  
    18      for l:=1 to j do  
    19       inc(f[i,j,k],a[l,i]);  
    20     end;  
    21  for i:=1 to n do  
    22   for j:=0 to n-i+1 do  
    23    if f[i,j,m]>max then  
    24     max:=f[i,j,m];  
    25  writeln(max);  
    26 end.  
  • 相关阅读:
    POJ 3280 Cheapest Palindrome (区间DP)
    UVaLive 4731 Cellular Network (期望DP)
    UVa 11404 Palindromic Subsequence (LCS)
    UVa 11552 Fewest Flops (DP)
    UVa 10534 Wavio Sequence (LIS+暴力)
    UVaLive 4256 Salesmen (简单DP)
    UVaLive 4094 WonderTeam (贪心)
    UVaLive 3266 Tian Ji -- The Horse Racing (贪心)
    POJ 3723 Conscription (最小生成树)
    NodeJS学习笔记 进阶 (4)基于express+muter的文件上传(ok)
  • 原文地址:https://www.cnblogs.com/PengBoLiuXu/p/4550906.html
Copyright © 2011-2022 走看看