snake vs block

题目描述

Tgopknight最近迷上了一款叫做Snake vs Block的游戏,他总觉得他自己玩出的不是最优解,但是他忙于享受游戏的乐趣,只好请你帮忙找出最优解。

Snake vs Block共有n行5列的格子,每个格子上有砖块或者豆豆或者啥也没有,同行相邻格子 之间可能有挡板,砖块和豆豆有对应的数值,蛇的初始长度是4,在第1行第3列上,每吃一个豆豆可以增加相应长度,撞上一个砖块会减少相应长度,并且得到相应分数,蛇不能穿过挡板,长度小于零 即死亡(临死前撞的砖块不记得分),死亡或到达终点离开第n行)游戏结束。

由于Tgopknight手速极快,他每前进到一行可以在这一行内任意移动,除非撞到挡板,他现在想知道他可以拿到的最高分是多少。

输入输出

input

第一行输入一个正整数n,表示格子的行数

后接n行,每行5个数,第i行第j个表示第i行第j列的格子,为ai,j,若ai,j<=0,则表示该格子上有个数 值为|ai,j|的砖块,若ai,j,则表示该格子上有个数值为ai,j的豆豆,若ai,j=0,则表示该格子上什么也没有

第n+2行输入一个整数m,表示挡板的个数。

后接m行,每行两个数x,y,表示第x行第y和第y+1列之间有挡板。

output

输出一行,一个正整数,为得到他能得到的最高分方案数

样例

input

5
-2 0 0 1 -2
0 2 0 0 0
-4 -3 -2 -3 -7
1 0 0 0 0
0 -2 0 -2 0
0

output

8

数据范围

对于30%的数据n < 5

另有20%的数据m = 0

另有20%的数据保证所有砖块所在的行数都比豆豆所在的行数大

对于 100%的数据1 <= n < =200,-10 <=ai,j < =10,0 <= m <= min(n * 4, 200),1 <= x < =n,1 <=y <= 4

数据保证第1行第3列上没有东西

数据有梯度

思路

把豆豆和砖块丢在一起dp即可。

令 f[i][j][k] 表示前i行,蛇的长度还剩下j,从第k列离开第i行的最大得分。

令 g[j1][1][r] 表示蛇的长度还剩下j1,当前行在第1列到第r列之间移动后仍然未死亡的最大得分。

f[0][4][3]=0 为初始状态。

对于每个i,首先令 g[j1][k][k] = f[i - 1][j1 - a[i][k]][k]+max(-a[i][k],0) 为初始状态。

状态转移方程为 g[j1][1][r] = max(g[j1-a[i][1]][1+1][r] +max(-a[i][j],0),g[j1-a[i][r]][1][r- 1] +max(-a[i][k], 0))

最后 f[i][j][k] = max{g[j][1][r](1<= l <= k<= r <= 5)}

ans = max{f[i][j][k]}

具体做法参考std。

时间复杂度o(n * (max(ai,j) * n) )

代码

#include <bits/stdc++.h>
using namespace std;
int n, a[205][5],m,x,y,f[205][10005][5]={{{0}}};
int g[10005][5][5] = {{{0}}}, maxi, ans = 0;
bool flag[205][4] = {{false}};
int main() {
freopen("snakevsblock.in","r",stdin);
freopen("snakevsblock.out","w",stdout);
scanf("%d",&n);
for (int i=1; i<=n; i++)
for (int j=0; j<5; j++)
scanf("%d",&a[i][j]);
scanf("%d", &m);
for (int i=1; i<=m; i++) {
scanf("%d%d", &x, &y);
flag[x][y-1] = true; //设置挡板
}
memset(f, -0x7f7f7f, sizeof(f));
f[0][4][2]=0;
maxi=n*50;
for(int i=1; i<=n;i++) {
memset(g,-0x7f7f7f, sizeof(g));
for (int j = 0; j<=maxi; j++)
for (int k =0; k<5; k++)
if (j-a[i][k]>= 0 && j-a[i][k]<=maxi)
f[i][j][k]=g[j][k][k]=f[i-1][j-a[i][k]][k]+max(-a[i][k], 0); //初始化
for (int l = 1; l <= 4; l++)
for (int j=0, k=j+l; k<5;j++,k++)
for (int v=0,val; v<=maxi; v++) {
/*挡板情况分类讨论*/
if (!flag[i][j] && (val=v-a[i][j]) >=0 && val<=maxi) g[v][j][k]=g[val][j+1][k]+max(-a[i][j],0);
if (!flag[i][k-1] && (val=v-a[i][k])>=0&& val<=maxi) g[v][j][k]=max(g[v][j][k],g[val][j][k-1]+max(-a[i][k],0)); for (int to = j; to <= k; to++) f[i][v][to]=max(f[i][v][to], g[v][j][k]);
}
}
for (int l=0;l<=n;l++)
for (int i=0; i<=maxi;i++)
for (int j=0;j<5;j++)
ans=max(ans,f[l][i][j]);
printf("%d\n", ans);
return 0;
}

  

【dp】10-15题解 snake vs block的更多相关文章

  1. macOS 10.15 开启 HiDPI

    普通的显示,接上 MacBook 发现原生的分辨率设置在 2K 显示器上字体很小,换成 1080P 分辨率显示效果又特别模糊.下面介绍MacBook强行开启 HiDPI. 什么是 HiDPI 它使用横 ...

  2. 背水一战 Windows 10 (15) - 动画: 缓动动画

    [源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing ...

  3. Linux Kernel 3.11.4/3.10.15/3.4.65/3.0.99

    Linux 今天又发布了4个更新版本,分别是: 3.11.4 2013-10-05 [tar.xz] [pgp] [patch] [view patch] [view inc] [cgit] [cha ...

  4. CVE-2015-1328 Ubuntu 12.04, 14.04, 14.10, 15.04 overlayfs Local Root

    catalog . 引言 . Description . Effected Scope . Exploit Analysis . Principle Of Vulnerability . Patch ...

  5. WTL汉化版2013.10.15

    汉化内容: 2013.10.15 版本:当前可下载Trunk最新版,wtl-code-467-trunk.zip 汉化内容: 1.应用向导的部分汉化,考虑到部分词汇的表述问题,只汉化无影响部分 2.资 ...

  6. [Mon Feb 10 15:21:06 2014] [notice] child pid 7101 exit signal File size limit exceeded (25)

    今天遇到的问题: LAMP的LOG里报如下错误. 然后IE和FIREFOX里显示连接被重置或是无法访问. 但自己建一个正常的PHP测试探针倒可以. 原来是PHP错误日志太多,无法写入LOG导致. [r ...

  7. Datatables插件1.10.15版本服务器处理模式ajax获取分页数据实例解析

    一.问题描述 前端需要使用表格来展示数据,找了一些插件,最后确定使用dataTables组件来做. 后端的分页接口已经写好了,不能修改.接口需要传入页码(pageNumber)和页面显示数据条数(pa ...

  8. 10.15 lzxkj

    几天前写的,忘了放了,在此填坑 10月16的题我出的不写题解了 lzxkj 题目背景 众所不周知的是, 酒店之王 xkj 一个经常迷失自我的人 有一天, 当起床铃再一次打响的时候, TA 用 O(1) ...

  9. npm install 提示 `gyp: No Xcode or CLT version detected!` MacOS 10.15

    https://github.com/nodejs/node-gyp/issues/569 https://github.com/nodejs/node-gyp/issues/1927 解决链接:ht ...

随机推荐

  1. Asp.NetCore Web开发之创建项目

    ​这一节,开始讲一下如何创建一个Asp.netCore Web项目,有两种常用的方式,一种是通过.NetCore SDK使用命令创建,另一种如果你使用的VisualStudio,可以直接根据引导创建. ...

  2. 『动善时』JMeter基础 — 19、JMeter配置元件【随机变量】

    目录 1.随机变量介绍 2.随机变量界面详解 3.随机变量的使用 (1)测试计划内包含的元件 (2)线程组界面内容 (3)随机变量界面内容 (4)HTTP请求界面内容 (5)查看结果 1.随机变量介绍 ...

  3. 【二】Kubernetes 集群部署-kubeadm方式(亲测)

    一.概述 本次部署 Kubernetes 集群是通过 kubeadm 工具来进行部署, kubeadm 是 Kubernetes 官⽅提供的⽤于快速部署 Kubernetes 集群的⼯具,利⽤其来部署 ...

  4. JMeter四种参数化方式

    JMeter参数化是指把固定的数据动态化,这样更贴合实际的模拟用户请求,比如模拟多个不同账号.JMeter一共有四种参数化方式,分别是: CSV Data Set Config Function He ...

  5. 用JIRA管理你的项目——(二)JIRA语言包支持及插件支持

    昨天兴奋地把JIRA环境搭好,瞅了一眼管理界面--全英文,真是汗! 尚且不说全中文版管理界面让人操作起来多少会有困难,更别说是全英文! 昨天赞叹JIRA语言包支持丰富,今天终于找到了号称100%的语言 ...

  6. [tools] 工具

    代码编辑 notepad++ 文档对比 Beyond Compare 代码阅读 source insight 代码分析 Scitools 下载 http://www.cr173.com/soft/29 ...

  7. [刷题] 167 Two Sum II

    要求 升序数组 找到两个数使得它们相加之和等于目标数 函数返回两个下标值(下标从1开始) 示例 输入:numbers = [2, 7, 11, 15], target = 9 输出:[1,2] 思路 ...

  8. Win10 禁用摄像头的方法及注意事项

    Win10 禁用摄像头的方法及注意事项 windows教程 2020-03-04  223 最新的Windows10系统中应该如何禁用摄像头呢?下面MS酋长与大家分享一下.当然,如果你说用个便利贴把摄 ...

  9. Linux_部署Ansible

    一.构建Ansible 1.定义清单 清单定义Ansible将要管理的一批主机 这些主机也可以分配到组中,以进行集中管理:组可以包含子组,主机也可以是多个组的成员 清单还可以设置应用到它所定义的主机和 ...

  10. Linux进阶之环境变量文件/etc/profile、/etc/bashrc、/etc/environment

    一.Centos 环境变量/etc/profile和/etc/profile.d 1.两个文件都是设置环境变量的文件. 2./etc/profile 是永久性的环境变量,是全局变量,/etc/prof ...