传送门

看起来普通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. 从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图

    从底层谈WebGIS 原理设计与实现(五):WebGIS中通过行列号来换算出多种瓦片的URL 之在线地图 作者:naaoveGI…    文章来源:naaoveGIS    点击数:2063    更 ...

  2. centos7 防火墙配置

    firewall-cmd --zone=public --add-port=80/tcp --permanentfirewall-cmd --zone=public --add-port=8080/t ...

  3. mongodb基础学习2-基本CRUD

    接着学习一下mongodb的基本的CRUD 先列出基本知识点,再给出相关的例子 增:语法: db.collectionName.insert(document); 1: 增加单篇文档,不指定_id时会 ...

  4. JSTL标签库学习3-fn

    fn的全称为functions, 就是提供一些方法,函数等. 主要是一些操作字符串的函数. fn:contains(str, str)显示用户浏览器,操作系统.可以从header中获取user-age ...

  5. 2018.8.14-C#复习笔记总

    using System; using System.Collections.Generic; //using System.Linq; using System.Text; using System ...

  6. Kotlin语言学习笔记(7)

    反射 // 反射 val c = MyClass::class val c2 = MyClass::class.java // 获取KClass的引用 val widget: Widget = ... ...

  7. Html解析类的新选择CsQuery

    今天在做一个html解析的方法,以前用HtmlAgilityPack或Winista.HTMLParser. 现在发现了一个巨好用的项目叫CsQuery,这货据说不仅能解析html还能提取css. 选 ...

  8. 吴裕雄 数据挖掘与分析案例实战(13)——GBDT模型的应用

    # 导入第三方包import pandas as pdimport matplotlib.pyplot as plt # 读入数据default = pd.read_excel(r'F:\\pytho ...

  9. 有名管道FIFO

    管道和FIFO的特征之一是它们的数据是一个字节流.这是UNIX的原生I/O模型.进程往其中写入的是字节流,系统不对它作解释. FIFO不存数据,只是通过它找到内核文件. 一.建立有名管道 1.命令mk ...

  10. Linux就业技术指导(七):游戏类运维重点流程解析

    一,某游戏公司例行上线与更新流程示例 例行维护/更新流程 1.1 更新前天 提前确认好要更新的是什么,更新会有人通知你,一般是运营人员 比如:我们明天做什么什么更新 1.2 第2天更新 一般固定点更新 ...