题目链接:https://www.luogu.org/problem/show?pid=1437#sub

     http://codevs.cn/problem/1257/

不得不说,这个题非常的恶心,在初次拿到题后我的思路是暴力,思索之后我还是只有暴力,想到最后我还是暴力,当然暴力的方法就是智者见智的了;

在看了题解的思路后,我尝试着去打着到题,结果,完美WA掉。。。然后我就WA了接近一周时间,最后浏览了各种博客才勉强A了这道恶心的dp

很多大佬的博客对于这道题的解法都是要转90度然后才定义dp,说实话,我觉得那种方法略偏麻烦,完全可以不处理原图直接dp

对于这道题,第一件事就是要怎么去看这张图

14   15   4   3   23

    33   33   76   2

    2   13   11

      22   23

        31

这是题干里的图,当然在看这张图的时候,要稍微换个方式

14  15  4    3  23

33  33  76  2

2    13  11

22  23

31

这张图有没有很熟悉,想起了啥???我反正是想起了dp入门题里面一道类似的三角形的题,不过图倒过来了

当然就算想起来了也没有大用处,因为这不是重点。

把图变成这样主要是为了方便分析滴

我们来定义一个数组吧:(这才是重点)

定义数组dp[i][j][k]表示第i列第j块砖时已经一共取了k块砖  (也可以理解为,第i列取了j块砖且一共去了k块砖)

好了定义出来了我相信这个方程其实也很容易搞出来了,要注意的是我们要从第n列往回找,不要问我为啥,因为不这样找,你的dp数组就会有些地方没有值

动态转移方程

----------------------------------------------------------------------------------------------------------------------------------

--                                                    --

--dp[i][j][k]=max(dp[ i ][ j ][ k ],dp[ i+1 ][ v ][ k-j ]+sum[ j ][ i ]); --

--                                                    -- 

----------------------------------------------------------------------------------------------------------------------------------

然后我就来解释一下这个动态转移方程

*dp[i+1][v][k-j]中,v是从j-1到m,因为在第i列取了j个砖头,所以第i+1列至少要去j-1个(通过题中条件,取第i,j块必须先取i-1, j+1和i-1,j)

然后在第i列是一共取k个,所以第i+1列肯定是一共取了k-j个

*sum[j][i]是表示从a[1][i]到a[j][i]的值的和。因为你取第i列第j块,肯定是在第i列上要把前j个取完的

把这些个一想通,这题就明了了,一个预处理sum[][],在来个4重循环跑个dp数组就完了

唯一还值得注意就是ans是可能存在dp数组的任何位置,所以一边动态转移,一边要比较ans

题不难,就看细心了

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#define maxn 55
#define maxm 1300
using namespace std; int n,m,ans;
int f[maxn][maxn][maxm];
int val[maxn][maxn]; int main()
{
scanf("%d%d",&n,&m);
memset(f,-,sizeof(f));
for(int i=;i<=n;i++)
{
for(int j=;j<=n-i+;j++)
{
scanf("%d",&val[i][j]);
val[i][j]+=val[i-][j];
}
}
f[n][][]=val[][n];
for(int i=n-;i>=;i--)
for(int j=;j<=n-i+;j++)
for(int k=j;k<=min(m,(n-i+)*(n-i+)/);k++)
//第i列的时候,最多取了p*(p+1)/2块砖头 p=n-i+1
{
for(int v=max(j-,);v<=n-i;v++)//i+1列最多就n-i块砖
{
if(f[i+][v][k-j]!=-&&f[i+][v][k-j]+val[j][i]>f[i][j][k])
f[i][j][k]=f[i+][v][k-j]+val[j][i];
}
ans=max(ans,f[i][j][k]);
}
printf("%d",ans);
}

[洛谷1437&Codevs1257]敲砖块<恶心的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 洛谷P1437 [HNOI2004]敲砖块(二维dp)

    传送门 看起来普通dp" role="presentation" style="position: relative;">dpdp像是有后效性的 ...

  5. Luogu 1437 [HNOI2004]敲砖块 (动态规划)

    Luogu 1437 [HNOI2004]敲砖块 (动态规划) Description 在一个凹槽中放置了 n 层砖块.最上面的一层有n块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖 ...

  6. 洛谷 P2015 二叉苹果树(codevs5565) 树形dp入门

    dp这一方面的题我都不是很会,所以来练(xue)习(xi),大概把这题弄懂了. 树形dp就是在原本线性上dp改成了在 '树' 这个数据结构上dp. 一般来说,树形dp利用dfs在回溯时进行更新,使用儿 ...

  7. 洛谷 P7163 - [COCI2020-2021#2] Svjetlo(树形 dp)

    洛谷题面传送门 神仙级别的树形 dp. u1s1 这种代码很短但巨难理解的题简直是我的梦魇 首先这种题目一看就非常可以 DP 的样子,但直接一维状态的 DP 显然无法表示所有情况.注意到对于这类统计一 ...

  8. 洛谷CF809C Find a car(数位DP)

    洛谷题目传送门 通过瞪眼法发现,\(a_{i,j}=(i-1)\text{ xor }(j-1)+1\). 二维差分一下,我们只要能求\(\sum\limits_{i=0}^x\sum\limits_ ...

  9. 【题解】洛谷P1169 [ZJOI2007] 棋盘制作(坐标DP+悬线法)

    次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵 ...

随机推荐

  1. 浅析TCP/IP协议

    浅析TCP/IP协议 0x00 什么是TCP/IP协议? ​ 想一想人与人之间交流需要什么?我们是不是要掌握一种我们都能体会到对方意思的语言.那么计算机与网络设备之间进行通信,是不是不同设备之间是不是 ...

  2. FreeModBus源码解析(1)---开篇

    一.设计思想 任何通信协议的实现都是基于状态机的设计思想,就是来了一串数据判断是是干啥的在调用相应的处理函数只不过高手一般采用回调处理. 如果你熟悉了回调.源码里的状态机的实现又可以理解,那么恭喜你已 ...

  3. 关于使用map存放数据乱序”问题“

    今天做项目中遇到了一个比较低级的错误,如果没注意将会变的更麻烦... 其实吧,也不难,要求就是将list中的值转为map后,再顺序输出map中的值,list的顺序怎样,加入到map的顺序也应怎样,不能 ...

  4. Windows SMBv3 CVE-2020-0796漏洞

    今天,Microsoft不小心泄露了有关新产品的信息 蠕虫的 Microsoft服务器消息块(SMB)协议中的漏洞(CVE-2020-0796). 今天,Microsoft不小心泄露了有关安全更新的信 ...

  5. plsql乱码问题

    1,问题:在plsql 中执行sql语句,查询结果带有中文,出现乱码,即" ??? ":如下: 2,解决: 1)输入sql语句 select * from V$NLS_PARAME ...

  6. 致远·面向人工智能-逐浪CMS v8.1.2全面发布[全球首个基于dotNET core3.0的中文CMS]

    原文:https://www.z01.com/down/3484.shtml 再远, 我都不会停息, 因为技术而生, 因为技术而强, 这是逐浪软件的命与根! 全新打造, 三百多项超级功能, 助你十分钟 ...

  7. python.五角星

    import turtle turtle.pensize(4)turtle.pencolor("black") turtle.fillcolor("red")t ...

  8. 普通索引和唯一索引如何选择(谈谈change buffer)

    假设有一张市民表(本篇只需要用其中的name和id_card字段,有兴趣的可以翻看“索引”篇,里面有建表语句) 每个人都有一个唯一的身份证号,且业务代码已经保证不会重复. 由于业务需求,市民需要按身份 ...

  9. 基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现

    目录 1. 概述 2. 实现 2.1. 原理 2.2. 核心代码 2.3. 第二种优化 3. 结果 1. 概述 我在之前的文章<基于均值坐标(Mean-Value Coordinates)的图像 ...

  10. computed 里面 不能写箭头函数 都要写 function () {} 否则页面会都不显示

    computed 里面 不能写箭头函数 都要写 function () {} 否则页面会都不显示