传送门

想明白了其实不难 强行瞎扯

这题的限制比较烦,导致了一行行转移几乎不能做(吧)

那么一列列转移呢?

设\(f_{i,j,k}\)表示前\(i\)列,取\(j\)个,其中第\(i\)列取从上往下前\(k\)个的答案

因为要取到一个砖块,要把该砖块上方以及右上方的先取走,那么如果这一列取\(k\)个,下一列最少取\(k-1\)个;反过来,对于列\(i\),上一列的\(k\)的取值范围为\([1,k+1]\),是个前缀,可以前缀最大值优化

写个方程就没了

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define inf 999999999 using namespace std;
const int N=50+10;
il LL rd()
{
re LL x=0,w=1;re char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,m,a[N][N],f[N][N*N][N]; //dp用的数组同时用来记录前缀k最大值(懒) int main()
{
n=rd(),m=rd();
for(int i=1;i<=n;i++)
for(int j=1;j<=n-i+1;j++)
a[i][j]=a[i-1][j]+rd(); //前缀和存储
for(int i=1,t=n;i<=n;i++,t+=n-i+1,t=min(t,m))
for(int j=1;j<=t;j++)
{
f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]);
for(int k=1;k<=n-i+1;k++)
{
if(j-k>=0) f[i][j][k]=max(f[i][j][k],f[i-1][j-k][k+1]+a[k][i]);
}
for(int k=1;k<=n-i+1;k++) f[i][j][k]=max(f[i][j][k],f[i][j][k-1]);
}
printf("%d\n",max(f[n][m][0],f[n][m][1]));
return 0;
}

luogu P1437 [HNOI2004]尻♂砖块的更多相关文章

  1. luogu P1437 [HNOI2004]敲砖块

    三角形向右对齐后 你想打掉一个砖块,那么你必须打掉右上方的三角形,前缀和维护 若是第i列若是k个,那么它右边的那一列至少选了k-1个 f[i][j][k] 表示从后向前选到第 i 列第j个一共打了k次 ...

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

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

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

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

  4. 2018.08.16 洛谷P1437 [HNOI2004]敲砖块(二维dp)

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

  5. P1437 [HNOI2004]敲砖块

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

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

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

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

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

  8. [HNOI2004] 打砖块

    1292. [HNOI2004] 打砖块 ★★   输入文件:brike.in   输出文件:brike.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在一个凹槽中放 ...

  9. 【洛谷 P1437】 [HNOI2004]敲砖块 (DP)

    题目链接 毒瘤DP题 因为\((i,j)\)能不能敲取决于\((i-1,j)\)和\((i-1,j+1)\),所以一行一行地转移显然是有后效性的. 于是考虑从列入手.我们把这个三角形"左对齐 ...

随机推荐

  1. Baltic Dry Index

    波罗的海干散货指数(Baltic Dry Index,缩写BDI),是航运业的经济指标,它包含了航运业的干散货交易量的转变. BDI波罗的海指数是由几条主要航线的即期运费(Spot Rate)加权计算 ...

  2. 荣耀实锤Magic2或将助力AI,再次带动成长?

    临近年底,热闹了一年的手机圈纷纷偃旗息鼓,准备为明年3月的新品发力.然而今天(12月7日),恰逢节气大雪,@荣耀手机 在微博发布了一张预热海报,随后荣耀总裁赵明转发这条微博表示「关于技术,真的有很多话 ...

  3. ACdream1187-Rational Number Tree-模拟/找规律

    找到规律模拟就可以了,用DFS模拟很简洁,用循环模拟比较直观(大概吧) 注意输入输出用%llu,1ULL<<64=0!被这几个小问题卡了好久 #include <cstdio> ...

  4. hdu 3949 XOR (线性基)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题 ...

  5. poj1068 【模拟】

    Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways:  ...

  6. 自学Linux Shell16.2-函数中使用变量

    点击返回 自学Linux命令行与Shell脚本之路 16.2-函数中使用变量 1. 向函数传递参数 函数可以使用标准参数环境变量来表示命令行传递给函数的参数.例如,     函数名在变量$0中定义,函 ...

  7. 自学Python1.3-centos内python3并与python2共存

    自学Python之路 自学Python1.3-centos内python3并与python2共存 1. 查看是否已经安装Python 测试机系统CentOS 7 默认安装了python2.7, 使用 ...

  8. [luogu1447][bzoj2005][NOI2010]能量采集

    题目大意 求出\(\sum_{i=1}^{n} \sum_{i=1}^{m} gcd(i,j)\times 2 -1\). 题解 解法还是非常的巧妙的,我们考虑容斥原理.我们定义\(f[i]\)表示\ ...

  9. 「loj3058」「hnoi2019」白兔之舞

    题意 有一个\((L+1)*n\) 的网格图,初始时白兔在\((0,X)\) , 每次可以向横坐标递增,纵坐标随意的位置移动,两个位置之间的路径条数只取决于纵坐标,用\(w(i,j)\) 表示,如果要 ...

  10. [SDOI2016]储能表——数位DP

    挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...