题意

在一个凹槽中放置了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;
}

最新文章

  1. coursera 公开课 文本挖掘和分析(text mining and analytics) week 1 笔记
  2. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
  3. (旧)子数涵数&#183;VB——变量
  4. Careercup - Facebook面试题 - 6321181669982208
  5. 七中滤波方法测试matlab实现
  6. 微信开发第6章 通过accesstoken获取用户粉丝列表
  7. css之浏览器初始化方案
  8. 在MDK中怎样生成*.bin格式的文件?
  9. STM32伺服编码器接口
  10. 1 Numpy-科学计算
  11. vs不自动退出控制台程序的办法
  12. RPC简介及框架选择
  13. YAML格式的语法
  14. .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  15. java里 equals和== 区别
  16. Lua学习笔记(2): 流程控制与循环以及初涉迭代器
  17. VK Cup 2016 - Round 1 (Div. 2 Edition) D. Bear and Polynomials
  18. django之全文检索
  19. 面试题:bootstrap栅格系统
  20. C++_代码重用5-类模板

热门文章

  1. RabbitMQ(四):使用Docker构建RabbitMQ高可用负载均衡集群
  2. go 学习之路(三)
  3. MyBatis 简介与入门
  4. Zabbix编译安装(全)
  5. React-Native之打包发布(Android)
  6. Computing Jobs
  7. Flink+Druid构建实时OLAP的探索
  8. 【POJ - 3280】Cheapest Palindrome(区间dp)
  9. cs231n官方note笔记
  10. Laya 中缩放的实现