【[HNOI2004]敲砖块】
非常巧妙的\(dp\)顺序
这道题如果按照最正常的顺序来\(dp\)的话,显然是没有办法做的,后效性太大了
所以我们可以巧妙的改变\(dp\)的顺序
我们注意到一个位置\((i,j)\)要被打到的话就必须将其右上方的所有砖块都打掉,于是我们我们设\(dp[i][j][k]\)表示打到了\((i,j)\)这个位置一共打了\(k\)个,其中\((i,j)\)被打掉了的最大值
如果我们改变一下\(dp\)顺序,从右向左对每列从上到下做\(DP\),我们就可以转移了
方程
\]
我们枚举左边那一列,如果打掉左边那一列上的\((p,j+1)\)的位置,那么就相当于\((i,j)\)左边被清空了,于是我们在打掉\((i,j)\)往上的一列就好了
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define max(a,b) ((a)>(b)?(a):(b))
#define maxn 51
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int dp[maxn][maxn][1505];
int a[maxn][maxn];
int n,m,ans,tot,sum;
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++)
for(re int j=1;j<=n-i+1;j++)
a[i][j]=read();
memset(dp,-20,sizeof(dp));
tot=1;
dp[0][n+1][0]=0;
for(re int i=1;i<=n;i++) dp[0][i][0]=0;
for(re int j=n;j>=1;--j,sum=0)
for(re int i=0;i<=n-j+1;i++)
{
tot++;
sum+=a[i][j];
for(re int k=i;k<=m;k++)
{
if(k>tot) break;
for(re int p=max(0,i-1);p<=n-j;p++)
dp[i][j][k]=max(dp[i][j][k],dp[p][j+1][k-i]+sum);
ans=max(dp[i][j][k],ans);
}
}
std::cout<<ans;
return 0;
}
【[HNOI2004]敲砖块】的更多相关文章
- Luogu 1437 [HNOI2004]敲砖块 (动态规划)
Luogu 1437 [HNOI2004]敲砖块 (动态规划) Description 在一个凹槽中放置了 n 层砖块.最上面的一层有n块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖 ...
- 洛谷 P1437 [HNOI2004]敲砖块 解题报告
P1437 [HNOI2004]敲砖块 题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下所示. 1 ...
- [HNOI2004]敲砖块
题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 33 33 7 ...
- P1437 [HNOI2004]敲砖块
题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 33 33 7 ...
- 【题解】HNOI2004敲砖块
题目传送门:洛谷1437 决定要养成随手记录做过的题目的好习惯呀- 这道题目乍看起来和数字三角形有一点像,但是仔细分析就会发现,因为选定一个数所需要的条件和另一个数所需要的条件会有重复的部分,所以状态 ...
- 洛谷P1437 [HNOI2004]敲砖块(dp)
题目背景 无 题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 ...
- yzoj P2343 & 洛谷 P1437 [HNOI2004]敲砖块
题意 在一个凹槽中放置了N层砖块,最上面的一层油N块砖,从上到下每层一次减少一块砖.每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如图所示. 如果你想敲掉第i层的第j块砖的话,若i=1,你可以直接 ...
- 2018.08.16 洛谷P1437 [HNOI2004]敲砖块(二维dp)
传送门 看起来普通dp" role="presentation" style="position: relative;">dpdp像是有后效性的 ...
- 【洛谷 P1437】 [HNOI2004]敲砖块 (DP)
题目链接 毒瘤DP题 因为\((i,j)\)能不能敲取决于\((i-1,j)\)和\((i-1,j+1)\),所以一行一行地转移显然是有后效性的. 于是考虑从列入手.我们把这个三角形"左对齐 ...
随机推荐
- 使用 IntelliJ IDEA 创建第一个java程序 Hello World
1.首先打开新建项目窗口 1.1.选择创建java程序 1.2.Project SDK,选择jdk安装路径 1.3.Additional Libraries and Frameworks 额外的库与框 ...
- DataGridview 绘制行序号
RowPostpaint 事件 通过Rectangle(矩形的意思)对象绘制矩形区域,然后在通过textRenderer的DeawText方法来绘制序列号. Rectangle(x,y width ...
- 一、hbase单机安装
下文将快速构建并启动单节点hbase,不使用hdfs作为存储,不使用独立的zookeeper hbase官网:http://hbase.apache.org/ 一.JDK环境 hbase需要JDK环境 ...
- 安装vmware player
一.简介 什么是虚拟机? 虚拟机是通过软件来模拟一个完整的计算机系统.简单来说,你可以在当前系统中通过虚拟机软件运行另外一个系统,并且与当前系统隔离. 什么是vmware? vmware(virtua ...
- 在jsp里调用out.flush()和response.flushBuffer()有什么区别
out.flush(); out是PrintWriter的实例 public void flush() Flush the stream. response.flushBuffer(): ...
- yum卸载
完全卸载依赖 -- 正常安装 yum install sl -- 列出操作 yum history list sl -- 根据显示install操作的id进行删除 yum history undo { ...
- sprintf和sscanf
sprintf 一个可以将输入打印到字符串的函数,用法与printf差不多 可以参考这篇文章: http://blog.csdn.net/masibuaa/article/details/563488 ...
- cf1088D. Ehab and another another xor problem(思维)
题意 题目链接 系统中有两个数\((a, b)\),请使用\(62\)以内次询问来确定出\((a, b)\) 每次可以询问两个数\((c, d)\) 若\(a \oplus c > b \opl ...
- com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现"$ref":"$[0]"现象问题
1.今天定义了一个JSONObject对象,引用的com.alibaba.fastjson.JSONObject,循环给这个对象赋值出现"$ref":"$[0]" ...
- 用一个div模拟textarea并实现高度自适应
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...