传送门

看起来普通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. java ee7 配置文件

    java ee7 配置文件 1. 项目目录 # ee pom.xml      Maven构建文件 /src/main/java      Java源文件 /src/main/resource     ...

  2. rar 按日期时间备份

    @echo off echo. echo backup start,please wait ... for /f %%i in ('date /t') do rar u F:\liaobin\bak\ ...

  3. xslt基础学习

    今天下午工作完成没事,登w3c的网站学习了一下xslt的基础知识,主要是因为工作中xml用的比较多,xslt也有用到,所以在这里学习一下. XSLT:一种用于转换 XML 文档的语言. XSLT 用于 ...

  4. MySql PartionBy

    SELECT tableOld.*, if(@channelName = tableOld.channelName, @rank := @rank + 1, @rank := 1) AS rank, ...

  5. Fragment 实现拍照,相册选图,设置头像功能

    设置不成功,http://bbs.csdn.net/topics/391112964 采纳问题回答:这个是fragment没有收到这个回调,原因不多说了,,,你用你对应的ragment.startAc ...

  6. padright padleft

    在 C# 中可以对字符串使用 PadLeft 和 PadRight 进行轻松地补位. PadLeft(int totalWidth, char paddingChar) //在字符串左边用 paddi ...

  7. thymeleaf 拼接字符串与变量

    参考https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html <span th:text="'The name o ...

  8. springboot分环境打包(maven动态选择环境)

    分环境打包核心点:spring.profiles.active pom.xml中添加: <profiles> <profile> <id>dev</id> ...

  9. python的range函数与切片操作符

    range(start,stop,step)参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range(0, 5);end:计数到end结束,但不包括end.例如 ...

  10. 第七章 二叉搜索树(c)平衡与等价