http://codevs.cn/problem/1257/ (题目链接)

题意

  在等腰三角形上打砖块,总共有m发炮弹,每块砖有一个权值,求打出的最大权值

Solution

  今天考试题,考场上的2个小时就此荒废了,1班是毛戏了。。看来dp还是有待提高,是时候多做做题了。

  此题一看就是dp对吧,就算不知道看了标签也知道了吧= =。我们把三角变成一个直角三角,于是我们发现,若要打第i列的第j个砖块,那么必须至少打掉第i+1列的前j-1个砖块以及第i列的前j-1个砖块,而打掉第i+1列前j-1个砖块就必须至少打掉第i+1列前j-2个砖块以及第i+2列前j-2个砖块……这样递归下去,形状大概长这样: 
   
  比如说我们要打掉第1列第3行的4,我们就必须先打掉以(2,2)为顶点的三角形和一个矩形,如果有更多的子弹,那么就可以打掉以(2,3)为顶点的三角形中的一些点,前提是第2列从1到3都被打掉。也就是说要打掉第i列第j行的砖块,只与第i+1列的砖块有关。

  于是我们可以写出dp方程。用a[i][j]表示从第i列的第1行到第j行的权值和,用f[i][j][k]表示打掉第i列第j行的砖块,已经打掉了k个。所以方程:f[i][j][k]=max(f[i][j][k],f[i+1][p][k-j]+a[j][i]),p=[]。

  但是我们还要考虑一种情况,就拿上面那幅图来说吧,如果我们有4发子弹,那么答案是多少呢?打掉第一行的第1、2、4块和第二行第1块是最优的,答案为16。我们发现这个最优答案它并不是由上面我们所说的那样第i列第j行的答案只与后一列有关,它是间断的。 
   
  怎么处理呢?我们可以再加入一行:第0行,第0行用来记录不取当前第i列中的砖块,直接取第i-1列中的砖块所得到的最大值,而这个并不与之前的dp方程矛盾,所以就做出来了。

代码

  1. // codevs1257
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<cmath>
  8. #define LL long long
  9. #define inf 2147483640
  10. #define Pi acos(-1.0)
  11. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  12. using namespace std;
  13. inline int getint() {
  14. int f,x=0;char ch=getchar();
  15. while (ch<'0' || ch>'9') {if (ch=='-') f=-1;else f=1;ch=getchar();}
  16. while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
  17. return f*x;
  18. }
  19.  
  20. const int maxn=100;
  21. int n,m;
  22. int a[maxn][maxn],f[maxn][maxn][600],t[maxn];
  23.  
  24. int main() {
  25. scanf("%d%d",&n,&m);
  26. for (int i=1;i<=n;i++)
  27. for (int j=1;j<=n-i+1;j++) {scanf("%d",&a[i][j]);a[i][j]+=a[i-1][j];}
  28. for (int i=1;i<=n;i++) t[i]=t[i-1]+i;
  29. t[0]=1;int ans=0;
  30. for (int i=n;i>=1;i--)
  31. for (int j=0;j<=n-i+1;j++) {
  32. for (int k=t[j];k<=m;k++)
  33. for (int p=max(0,j-1);p<=n-i+1;p++)
  34. f[i][j][k]=max(f[i][j][k],f[i+1][p][k-j]+a[j][i]);
  35. ans=max(ans,f[i][j][m]);
  36. }
  37. printf("%d",ans);
  38. return 0;
  39. }

  

【codevs1257】 打砖块的更多相关文章

  1. codevs1257 打砖块

    题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,--最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,--i,第i层的第j块砖有一个价值a[ ...

  2. [洛谷1437&Codevs1257]敲砖块<恶心的dp>

    题目链接:https://www.luogu.org/problem/show?pid=1437#sub http://codevs.cn/problem/1257/ 不得不说,这个题非常的恶心,在初 ...

  3. [HNOI2004]打砖块(敲砖块)

    题目:codevs1257.洛谷P1437 题目大意:有一些砖块呈倒三角形状,每块砖敲掉后有一个分数.除第一行外,敲掉一块砖必须先把上面两块砖敲掉.现在你能敲m块砖,求能得到的最大分数. 解题思路:此 ...

  4. [BZOJ1112][POI2008]砖块Klo

    [BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...

  5. BZOJ 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1736  Solved: 606[Submit][Statu ...

  6. 洛谷P1174 打砖块

    题目描述 小红很喜欢玩一个叫打砖块的游戏,这个游戏的规则如下: 在刚开始的时候,有n行*m列的砖块,小红有k发子弹.小红每次可以用一发子弹,打碎某一列当前处于这一列最下面的那块砖,并且得到相应的得分. ...

  7. FZU 1025 状压dp 摆砖块

    云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了 这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了 dp思想都在代码注释里 ...

  8. Demon_打砖块(建造一面墙,发射子弹打砖块)

    using UnityEngine; using System.Collections; public class CubeInit : MonoBehaviour { //砖块预设体 public ...

  9. 一个打砖块的小游戏1.0 KILL THE BLOCKS !

    /******************************************** * 程序名称:MR.DUAN 的打砖块(KILL THE BLOCKS !) * 作 者:WindAutum ...

随机推荐

  1. Android组件---四大布局的属性详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4372222.html Android常见布局有下面几种: LinearL ...

  2. 第11章 Windows线程池(3)_私有的线程池

    11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThread ...

  3. Eclipse c++头文件问题(未完)

    http://stackoverflow.com/questions/7905025/string-could-not-resolved-error-in-eclipse-for-c-eclipse- ...

  4. [原创]gerrit上分支操作记录(创建分支、删除分支)

    Git分支对于一个项目的代码管理而言,是十分重要的! 许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉. 在此,我将自己的一些操作经历做一梳理,希望能帮助到 ...

  5. 了解了这些才能开始发挥jQuery的威力(转)

    链接:http://www.cnblogs.com/dolphinX/archive/2013/10/08/3347677.html 由于当前jQuery如此的如雷贯耳,相信不用介绍什么是jQuery ...

  6. Ruby Web实时消息后台服务器推送技术---GoEasy

    越来越多的项目需要用到实时消息的推送与接收,怎样用Ruby实现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推 ...

  7. Linux PPTP搭建

    PPPTP概述 tcp1723 1,安装 rpm -ivh ppp--14.1.rhel5.x86_64.rpm #安装ppp rpm -ivh pptpd--.rhel5.x86_64.rpm #安 ...

  8. Linux 守护进程一

    守护进程是一个后台进程,它无需用户输入就能运行,经常是提供某种服务. LInux作为服务器,主要的进程也都是为系统或用户提供后台服务功能. 常见的守护进程有Web服务器.邮件服务器以及数据库服务器等等 ...

  9. unity触发器和碰撞器

    Unity中检测碰撞的方法有两种,一种是触发器一种是碰撞器,现在我来解释一下两种的区别. 触发器:有三种方法,分别是OnTriggerEnter,OnTriggerStay,OnTriggerExit ...

  10. 这些HTML、CSS知识点,面试和平时开发都需要 (转)

    http://www.cnblogs.com/w-wanglei/p/5414979.html No1.HTML 1.网页结构 网页结构一般都包含文档声明DOCTYPE,并且在head中的meta应该 ...