首页 > 其他分享 >[题解][洛谷P1174] 打砖块

[题解][洛谷P1174] 打砖块

时间:2024-04-18 15:45:48浏览次数:28  
标签:洛谷 int 题解 sum 子弹 tot P1174 打碎 砖块

题目分析

n行m列的砖块,起始有k发子弹。每次可以用一发子弹,打碎某一列当前处于这一列最下面的那块砖,并且得到相应的得分。
某些砖块打碎以后会获得一个砖块。
求最大得分。

题解

可以看出是一道动态规划题。
关键在于如何设计状态。
先考虑砖块打碎不会得到子弹的情况:这个时候可以将同一列的连续多个砖块看作一个物品,其代价是砖块的数量。
预处理后,得到每组各有n个物品,共m组。
此时转换为分组背包问题。
再考虑如何处理获得新子弹的问题:

  • 首先,最后一个打碎的砖块一定不会获得子弹,不然可以另外打碎新的砖块。
  • 对于通过上述算法得到的分组背包物品代价,减去获得的子弹数量,视为新的代价。
  • 设f[i][j][0/1]表示:在i组物品中,使用了j个子弹,且是否已打碎最后一个砖块(0/1)的最大价值。可知答案为f[m][k][1]。

代码

#include<bits/stdc++.h>
#define  int  long long
using namespace std;
const int N=207;
int a[N][N],v[N][N],sum[N][N][2],f[N][N][2];
signed main(){
	int n,m,kk;
	cin>>n>>m>>kk;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c;
			cin>>a[i][j]>>c;
			v[i][j]= c=='Y';
		}
	}
	for(int i=1;i<=m;i++){
		int tot=0;
		for(int j=n;j>=1;j--){
			if(v[j][i])sum[i][tot][0]+=a[j][i];
			else{
				++tot;
				sum[i][tot][0]=sum[i][tot-1][0]+a[j][i];
				sum[i][tot][1]=sum[i][tot-1][0]+a[j][i];
			}
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=0;j<=kk;j++){
			for(int k=0;k<=min(j,n);k++){
				f[i][j][0]=max(f[i][j][0],f[i-1][j-k][0]+sum[i][k][0]);//对于尚未选到最后一个砖块,直接尝试继承i-1并更新。
				if(k)f[i][j][1]=max(f[i][j][1],f[i-1][j-k][0]+sum[i][k][1]);//若要将此时选到的视为最后一个砖块:从尚未选到最后一个砖块处更新
				if(j>k)f[i][j][1]=max(f[i][j][1],f[i-1][j-k][1]+sum[i][k][0]);//将之前选到的视为最后一个砖块:从已经选到最后一个砖块处更新,注意j>k,否则会不足够支付代价。
			}
		}
	}
	cout<<f[m][kk][1]<<endl;
} 

标签:洛谷,int,题解,sum,子弹,tot,P1174,打碎,砖块
From: https://www.cnblogs.com/zwzww/p/18143635

相关文章

  • [题解] [NOIP 1999] 导弹拦截
    [NOIP1999]导弹拦截题目描述有若干枚导弹,每一枚导弹的高度是\(h_i\),导弹拦截系统每次拦截导弹都不能比上一次拦截的高度更高,导弹拦截没有冷却时间且第一次拦截的高度任意。问题1:一套系统最多能拦截多少导弹?问题2:拦截所有导弹最少需要多少个拦截系统?输入格式一行,若干个......
  • LibreOJ-3038 「JOISC 2019 Day3」穿越时空 Bitaro <线段树> 题解
    审题一条链每条边有通行时间上下界限制通过一条边需要\(1\)单位时间站在当前节点时间减少\(1\)耗费\(1\)单位代价\(q\)次询问要么更改一条边的通信时间上下界要么询问在\(b\)时刻在城市\(a\),\(d\)时刻到达城市\(c\)的最小代价思想做题准备......
  • 前端面试题解析与总结
    在2024年的前端行业,面试是进入理想公司的一道门槛。不同公司的面试流程和考察点各有不同,下面将结合三家知名公司的面试题目进行分析和总结,为广大前端开发者提供一份参考指南。一、某对外电商一面:笔试题:弹窗组件防抖截流代码实现关系型数组转换成树形结构对象数组全排列......
  • at_cf17final_j Tree MST 题解
    题目链接点击打开链接题目解法还是挺有收获的题解法1完全图求\(mst\),首先应该考虑\(boruvka\)算法现在的问题转化成了求\(O(\logn)\)次每个点\(x\)到不在\(x\)的连通块中的点的最短边这个可以换根\(dp\)求子树内的是好求的,只要记录所有连通块的最小值和次小值......
  • 洛谷题单指南-动态规划1-P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles
    原题链接:https://www.luogu.com.cn/problem/P1216题意解读:计算数字三角形最高点到最后一行路径之和最大值,典型线性DP。解题思路:设a[i][j]表示数字三角形的值,设dp[i][j]表示从最高点到第i行第j列路径之和的最大值,由于每一步可以走到左下方的点也可以到达右下方的点,所以dp[i][......
  • mongodb启动失败问题解决
    解决办法sudochown-Rmongod:mongod/var/lib/mongochown-Rmongod:mongod/var/log/mongodb/chown-Rmongod:mongod/tmp/mongodb-27017.sock或者可以使用mongod--config/etc/mongod.conf参考:MongoDBloadsbutbreaks,returningstatus=14-AskUbuntumon......
  • AT_abc211_d [ABC211D] Number of Shortest paths 题解
    题目简述给定一张$n$个点$m$条边的无向无权图,问从$1$到$n$的最短路有多少条。题目分析设$cnt_i$表示从$1$到$i$的最短路条数,$dis_i$表示最短路。这道题可以考虑使用BFS做,对于一个点$v$,设第一次更新它的点为$u$,则它的转移应为$cnt_v\leftarrowcnt_u$并......
  • CF81C Average Score 题解
    题目简述给定一个长度为$n$的序列,在其中取出$x$个数,构成一个数列$a$,剩下的$y$个数构成数列$b$。若第$i$个数在数列$a$中,$ans_i$等于$1$,否则等于$2$,请你给出一种方案使得两数列的平均数之和最大且$ans$的字典序最小.题目分析我们先考虑$x=y$的情况,在这种情......
  • ICPC2023杭州站题解(B D E F G H J M)
    本场金牌数量较其他场多(45枚),但金牌线题数不多。五题为分水岭,五道简单题过后所有题均为金牌题,其中有四道可做,即ABEF,做出任意一道即可拿金牌。这里提供除A题以外的所有可做题的题解。ICPC2023杭州站:M:加入比当前选择的所有数大的数一定会让平均值上升,因此答案数列中,V图中的......
  • [题解][洛谷P1136] 迎接仪式
    题目描述对于一个由字母“j”和“z”组成的字符串,可以任意交换两个字符的位置不超过k次,求最多能出现多少个“jz”字串。题解动态规划题。设f[i][j][k][0/1]表示到第i位,前面交换了j个“j”,交换了k个“z”,且第i位是j(用0表示)或z(用1表示)。当j=k时即为可行解。为什么需要用第四维......