传送门

看起来普通dp" role="presentation" style="position: relative;">dpdp像是有后效性的样子。。。

继续分析:如果我们第i+1列的最优值已经处理出来了,那么第i列的最优值就跟第i+1列没有关系了。

因为只要保证第i+1列至少挖到了第i-1行就行,如何保证?从第i+1列的第i-1行开始对第i列转移就行了,注意边界其实这题不难。

主要是要想到要从前一列的状态来推出当前列的状态。

事实上,如果我们用f[i][j][k]表示正在挖第i行j列的砖块,已经挖了k个,那么f[t][j+1][k−i](i−1≤t≤n−j)" role="presentation" style="position: relative;">f[t][j+1][k−i](i−1≤t≤n−j)f[t][j+1][k−i](i−1≤t≤n−j)是可以对f[i][j][k]" role="presentation" style="position: relative;">f[i][j][k]f[i][j][k]做出贡献的,不难想到从前者转移过来需要将第i列的第1~i行的砖块都挖掉,因此转移的时候记录一个前缀和用于转移就行了。

代码:

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int n,K,a[55][55],f[55][55][3005],ans=0;
int main(){
    memset(f,-inf,sizeof(f)),scanf("%d%d",&n,&K),f[0][n+1][0]=0;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n-i+1;++j)
            scanf("%d",&a[i][j]);
    for(int j=n;j;--j)
        for(int i=0,sum=0;i<=n-j+1;sum+=a[++i][j])
            for(int k=i;k<=K;++k)
                for(int t=max(0,i-1);t<=n-j;++t)
                    f[i][j][k]=max(f[i][j][k],f[t][j+1][k-i]+sum);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n-i+1;++j)
            ans=max(ans,f[i][j][K]);
    cout<<ans;
    return 0;
}

2018.08.16 洛谷P1437 [HNOI2004]敲砖块(二维dp)的更多相关文章

  1. 洛谷 P1437 [HNOI2004]敲砖块 解题报告

    P1437 [HNOI2004]敲砖块 题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下所示. 1 ...

  2. 洛谷P1437 [HNOI2004]敲砖块(dp)

    题目背景 无 题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 ...

  3. yzoj P2343 & 洛谷 P1437 [HNOI2004]敲砖块

    题意 在一个凹槽中放置了N层砖块,最上面的一层油N块砖,从上到下每层一次减少一块砖.每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如图所示. 如果你想敲掉第i层的第j块砖的话,若i=1,你可以直接 ...

  4. 2018.08.16 洛谷P3607 [USACO17JAN]序列反转(线性dp)

    传送门 一道感觉比较简单的dp. 注意是要求翻转一个子序列而不是一段连续的数(被坑了很多次啊)... 看到数据范围果断开一个四维数组来dp一波. 我们显然可以用f[i][j][k][t]表示下标在[l ...

  5. 2018.08.16 洛谷P1471 方差(线段树)

    传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h&g ...

  6. 2018.08.16 洛谷P2029 跳舞(线性dp)

    传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...

  7. 2018.08.17 洛谷[POI2010]GRA-The Minima Game(线性dp)

    传送门 短代码神奇dp. 自己yy的思路居然1A了好高兴啊! 不难想到每个人选择的时候一定是取连续的最大的那一段数,自然需要先排序. 然后可以用dp[i]表示当前最大数是a[i]的时候先手可以获得的最 ...

  8. 2018.08.04 洛谷P3380 【模板】二逼平衡树(树套树)

    传送门 技不如人,写的权值线段树套线段树在bzoj上无论如何都卡不过空间. 这是一道树套树简单题,感觉没什么好说的. 直接权值线段树套平衡树就行了. 代码: #include<bits/stdc ...

  9. [洛谷1437&Codevs1257]敲砖块<恶心的dp>

    题目链接:https://www.luogu.org/problem/show?pid=1437#sub http://codevs.cn/problem/1257/ 不得不说,这个题非常的恶心,在初 ...

随机推荐

  1. leetcode453

    public class Solution { public int MinMoves(int[] nums) { var list = nums.OrderBy(x => x).ToList( ...

  2. shiro 没有权限异常处理

    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> ...

  3. C++Primer笔记-----继承

    ==========================================================================day11 面向对象程序设计============ ...

  4. JAVA NIO学习记录2-非阻塞式网络通信

    一.阻塞与非阻塞 传统的IO 流都是阻塞式的.也就是说,当一个线程调用read() 或write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信 ...

  5. __builtin__与__builtins__的区别与关系

    在学习Python时,很多人会问到__builtin__.__builtins__和builtins之间有什么关系.百度或Google一下,有很 多答案,但是这些答案要么不准确,要么只说了一点点,并不 ...

  6. Haskell语言学习笔记(42)Bifunctor

    Bifunctor class Bifunctor p where bimap :: (a -> b) -> (c -> d) -> p a c -> p b d bim ...

  7. Nunit与Vs 2012配合使用

    要使用Nunit首先要去官网 http://www.nunit.org/ 下载Nunit.win  .msi是安装版.   bin  .zip是绿色版. 下载完后安装. 在 VS2012 中使用 Nu ...

  8. scala 基本语法

    1.对于一个二元数组,键值对(k,v) 用map的时候,要取第一个或者第二个元素,用 _1 或者 _2表示. scala> words.take(2)res40: Array[(String, ...

  9. Python——序列

    #!/usr/bin/python #coding:utf8 ''' Python——序列 字符串的操作 ''' s = 'abcdefg' print s print s[2] print s[-1 ...

  10. jenkins systemctl启动失败

    centos yum或者rpm安装jenkins后起不来 vi /etc/init.d/jenkins candidates="/usr/local/jdk1.8.0_171/bin/jav ...