yzoj P2343 & 洛谷 P1437 [HNOI2004]敲砖块
题意
在一个凹槽中放置了N层砖块,最上面的一层油N块砖,从上到下每层一次减少一块砖。每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如图所示。

如果你想敲掉第i层的第j块砖的话,若i=1,你可以直接敲掉它;若i>1,则你必须先敲掉第i-1层的第j和第j+1块砖。
你现在可以敲掉最多M块砖,求得分最多能有多少。
一道dp题,一开始想到的是一行一行dp然而发现,选[ i , j ]就要选[ i-1 , j+1]和[ i ,j ]上面所有的方块,似乎不满足无后效性,那怎么办呢?
我们发现输入文件时这样的
4 5
2 2 3 4
8 2 7
2 3
49
我们可以去思考是不是可以一列一列dp,从n列向1列dp这样就没有后效性了,我们可以定义状态f[i][j][k]表示当前在第i列选了j个,总共选了k个,状态转移方程为
f[i][j][k]=max(f[i+1][t][k-j]+s[i][j],f[i][j][k])
t>=j-1&&t<=n-i
s[i][j]表示第j列前i个的和
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,f[55][55][3000],a[55][55],s[55][55];
int main(){
	scanf("%d %d",&n,&m);
	memset(f,-0x3f,sizeof(f));
    f[n+1][0][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 i=1;i<=n;++i){
		for(int j=1;j<=n-i+1;++j){
			s[j][i]=s[j][i-1]+a[i][j];
		}
	}
	for(int i=n;i>=1;--i){
		for(int j=0;j<=n-i+1;++j){
			for(int k=j;k<=m;++k){
				for(int t=max(j-1,0);t<=n-i;++t){
					f[i][j][k]=max(f[i+1][t][k-j]+s[i][j],f[i][j][k]);
				}
			}
		}
	}
    for(int i=1;i<=n;++i){
    	for(int j=1;j<=n-i+1;++j){
    		ans=max(ans,f[i][j][m]);
    	}
    }
    printf("%d",ans);
	return 0;
}
yzoj P2343 & 洛谷 P1437 [HNOI2004]敲砖块的更多相关文章
- 洛谷 P1437 [HNOI2004]敲砖块  解题报告
		P1437 [HNOI2004]敲砖块 题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下所示. 1 ... 
- 洛谷P1437 [HNOI2004]敲砖块(dp)
		题目背景 无 题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 ... 
- 2018.08.16 洛谷P1437 [HNOI2004]敲砖块(二维dp)
		传送门 看起来普通dp" role="presentation" style="position: relative;">dpdp像是有后效性的 ... 
- P1437 [HNOI2004]敲砖块
		题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 33 33 7 ... 
- luogu P1437 [HNOI2004]敲砖块
		三角形向右对齐后 你想打掉一个砖块,那么你必须打掉右上方的三角形,前缀和维护 若是第i列若是k个,那么它右边的那一列至少选了k-1个 f[i][j][k] 表示从后向前选到第 i 列第j个一共打了k次 ... 
- [洛谷1437&Codevs1257]敲砖块<恶心的dp>
		题目链接:https://www.luogu.org/problem/show?pid=1437#sub http://codevs.cn/problem/1257/ 不得不说,这个题非常的恶心,在初 ... 
- Luogu 1437 [HNOI2004]敲砖块 (动态规划)
		Luogu 1437 [HNOI2004]敲砖块 (动态规划) Description 在一个凹槽中放置了 n 层砖块.最上面的一层有n块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖 ... 
- 【题解】HNOI2004敲砖块
		题目传送门:洛谷1437 决定要养成随手记录做过的题目的好习惯呀- 这道题目乍看起来和数字三角形有一点像,但是仔细分析就会发现,因为选定一个数所需要的条件和另一个数所需要的条件会有重复的部分,所以状态 ... 
- 【洛谷 P1437】 [HNOI2004]敲砖块 (DP)
		题目链接 毒瘤DP题 因为\((i,j)\)能不能敲取决于\((i-1,j)\)和\((i-1,j+1)\),所以一行一行地转移显然是有后效性的. 于是考虑从列入手.我们把这个三角形"左对齐 ... 
随机推荐
- Extjs的textfield的颜色设置和出现的问题笔记
			Ext.getCmp('alarmsLevelVal').setFieldStyle('background-color:#ff0000;background-p_w_picpath: none; ' ... 
- WinForm开发中通用附件管理控件设计开发参考
			1.引言 在WinForm开发中,文件附件的管理几乎在任何一个应用上都会存在,是一个非常通用集中的公共模块.我们日常记录会伴随着有图片.文档等附件形式来展现,如果为每个业务对象都做一个附件管理,或者每 ... 
- Redhat 离线安装 Docker (Community from binaries)
			需求 在离线环境安装Docker (Community版),因为Enterprise版要花钱.当然资金充裕的客户可参考https://docs.docker.com/install/linux/doc ... 
- SQL Labs刷题补坑记录(less31-less53)
			LESS31: 双引号直接报错,那么肯定可以报错注入,并且也过滤了一些东西,^异或没有过滤,异或真香 -1" and (if(length(database())=8,1,0)) and & ... 
- 动态SQL查询
			if+where: 用于查询操作,where标签可以智能判断是否添加and.or.where关键词 示例: <select id="findByParam" resultTy ... 
- leetcode bug free
			---不包含jiuzhang ladders中出现过的题.如出现多个方法,则最后一个方法是最优解. 目录: 1 String 2 Two pointers 3 Array 4 DFS &&am ... 
- CSV Data Set Config 详细使用说明
			JMeter 5.1.1 CSV Data Set Config 场景一:线程组中设置:单线程执行1次 如上图所示:变量名称为空时JMeter默认把new 1.txt的文件首行作为变量名 再如:此时A ... 
- [Spring cloud 一步步实现广告系统] 2. 配置&Eureka服务
			父项目管理 首先,我们在创建投放系统之前,先看一下我们的工程结构: mscx-ad-sponsor就是我们的广告投放系统.如上结构,我们需要首先创建一个Parent Project mscx-ad 来 ... 
- 关于在taro使用wx.parse那些事
			好久不见,好久没更新博客,最近工作也比较忙,今天在使用解决富文本的时候遇到两个bug,由于第一次使用wx.parse经验不足,走了很多弯路,今天特地把自己修复bug的感想分享一下,希望能帮助更多的小伙 ... 
- 使用base64编码把背景添加到CSS文件中
			最近博客背景图片的外链挂了,没办法,只好另找办法. 在博客园后台,有一个“文件”菜单,可以上传自己的文件,我就打算把图片传到里面.但却发现了一个很反人性的设置:不允许上传jpg,png文件,允许上传的 ... 
