题目链接:https://nanti.jisuanke.com/t/16447

题意:

  蒜头君有一只坐骑,人马。

  一天,蒜头君骑着他的坐骑走上了一片n*m的大荒野,一开始时,蒜头君在(1,1)点,他要前往(n,m)点,蒜头君的人马每次可以向右或向下移动一格。然而这片荒野并不平静,除了起点和终点外每个点都有一只怪物会袭击蒜头君。

  然而蒜头君的人马强大无比,它会先对怪物造成等同于它攻击力的伤害,然后蒜头君才会受到怪物的攻击,伤害等同于怪物的攻击力。然后人马再攻击怪物,怪物再攻击蒜头君,直至怪物死去,假设每个怪物具有相同的体力。

  此外,蒜头君的人马还有一个强大无比的技能,使用该技能会使蒜头君接下来 k次移动,每一次移动后增加等同于移动到的格子的怪物的攻击力,k次移动后,人马攻击力恢复至初始攻击力。人马必须在当前一个技能释放完后才可以释放下一个技能,且一共可释放技能的次数有限,那么试问蒜头君从起点到终点最少受到多少点伤害。

  注意:蒜头君的体力是无限的。

题解:

  用dp[i][j][p]表示在(i , j)点已经用完了p次技能时的最小伤害。

  用us[i][j][p]表示在(i , j)点已经正在用第p次技能时的最小伤害。

  那么到终点的最小伤害值 = min( min{dp[n][m][p]} , min{us[n][m][p]} )  (枚举p:0 <= p <= t)

  接下来考虑如何转移。

  现在在(i , j)点,要么不用技能,要么用技能。

  ① 如果不用技能,那就直接转移:

    dp[i+1][j] = min(dp[i+1][j] , dp[i][j] + 在(i+1 , j)点受到的伤害值)

    dp[i][j+1] = min(dp[i][j+1] , dp[i][j] + 在(i , j+1)点受到的伤害值)

  ② 如果用技能,那么用dfs转移到每一个可能的用完这次技能的终点,同时在dfs中更新us数组的值。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 505
#define MAX_T 15
#define INF 10000000 using namespace std; int n,m,t,k,h,atk;
int a[MAX_N][MAX_N];
int dp[MAX_N][MAX_N][MAX_T];
int us[MAX_N][MAX_N][MAX_T]; void read()
{
cin>>n>>m>>t>>k>>h>>atk;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
cin>>a[i][j];
}
}
} void init()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
for(int k=;k<=t;k++)
{
dp[i][j][k]=INF;
us[i][j][k]=INF;
}
}
}
} void dfs(int x,int y,int tot,int step,int atk,int dam)
{
us[x][y][tot]=min(us[x][y][tot],dam);
if(step==k)
{
dp[x][y][tot]=min(dp[x][y][tot],dam);
return;
}
dfs(x+,y,tot,step+,atk+a[x+][y],dam+((h-)/(atk+a[x+][y])*a[x+][y]));
dfs(x,y+,tot,step+,atk+a[x][y+],dam+((h-)/(atk+a[x][y+])*a[x][y+]));
} void solve()
{
init();
dp[][][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
for(int p=;p<=t;p++)
{
if(dp[i][j][p]>=INF) continue;
if(i+<=n) dp[i+][j][p]=min(dp[i+][j][p],dp[i][j][p]+((h-)/atk)*a[i+][j]);
if(j+<=m) dp[i][j+][p]=min(dp[i][j+][p],dp[i][j][p]+((h-)/atk)*a[i][j+]);
if(p<t) dfs(i,j,p+,,atk,dp[i][j][p]);
}
}
}
} void print()
{
int minn=INF;
for(int i=;i<=t;i++)
{
minn=min(minn,dp[n][m][i]);
minn=min(minn,us[n][m][i]);
}
cout<<minn<<endl;
} int main()
{
read();
solve();
print();
}

计蒜客模拟赛D1T3 蒜头君的坐骑:用dfs转移dp的更多相关文章

  1. 计蒜客模拟赛D2T3 蒜头君救人:用bfs转移状压dp

    题目链接:https://nanti.jisuanke.com/t/16444 题意: 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境 ...

  2. 计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组

    题目链接:https://nanti.jisuanke.com/t/16443 题意: 给你一个由1~n构成的正整数序列,有m组询问,每组询问要求输出[l , r]区间内的逆序对个数. 数据范围: 对 ...

  3. 计蒜客模拟赛D2T1 蒜头君的兔子:矩阵快速幂

    题目链接:https://nanti.jisuanke.com/t/16442 题意: 有个人在第一年送了你一对1岁的兔子.这种兔子刚生下来的时候算0岁,当它在2~10岁的时候,每年都会生下一对兔子, ...

  4. 计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和

    题目链接:https://nanti.jisuanke.com/t/16446 题意: 给你一棵有n个节点的树以及每条边的长度,输出树上节点之间的最短距离和.然后进行m次操作,每次操作更改一条边的长度 ...

  5. 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和

    题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...

  6. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  7. 计蒜客模拟赛5 D2T2 蚂蚁搬家

    很久很久以前,有很多蚂蚁部落共同生活在一片祥和的村庄里.但在某一天,村庄里突然出现了一只食蚁兽,蚂蚁们为了保全性命而决定搬家. 然而这个村庄四面环山,想要离开这个村庄必须要从地洞里离开,村子里一共有 ...

  8. 计蒜客模拟赛 #5 (B 题) 动态点分治+线段树

    虽然是裸的换根dp,但是为了在联赛前锻炼码力,强行上了点分树+线段树. 写完+调完总共花了不到 $50$ 分钟,感觉还行. code: #include <bits/stdc++.h> # ...

  9. [计蒜客] 矿石采集【记搜、Tarjan缩点+期望Dp】

    Online Judge:计蒜客信息学3月提高组模拟赛 Label:记搜,TarJan缩点,树状数组,期望Dp 题解 整个题目由毫无关联的两个问题组合成: part1 问题:对于每个询问的起点终点,求 ...

随机推荐

  1. 基于AFN封装的带缓存的网络请求

    给大家分享一个基于AFN封装的网络请求 git: https://github.com/zhouxihi/NVNetworking #带缓存机制的网络请求 各类请求有分带缓存 , 不带缓存, 可自定义 ...

  2. pdf文件之itextpdf插入html内容以及中文解决方案

    简述 目前网上已经有很多种html文件直接转pdf的技术帖子,但是很少有直接将部分html作为段落插入到pdf中,而且也没有一个可以很好的解决中文显示的问题. 因此今天上午围绕这个问题进行了研究,把解 ...

  3. 从浅入深剖析angular表单验证

    最近手上维护的组件剩下的BUG都是表单验证,而且公司的表单验证那块代码经历的几代人,里面的逻辑开始变得不清晰,而且代码结构不是很angular. 是很有必要深入了解表单验证. 入门之前,我觉得应该先了 ...

  4. Servlet启动的时机

    Servlet启动的时机有两个:1.在用户第一次请求时:2.在web应用启动之时. 在web.xml 文件中配置 格式 <servlet> <servlet-name>**** ...

  5. Python3控制结构与函数

    1.if语句的另一种写法: expression1 if boolean_expression else expression2 boolean_expression为true时使用expressio ...

  6. etcd raft library设计原理和使用

    早在2013年11月份,在raft论文还只能在网上下载到草稿版时,我曾经写过一篇blog对其进行简要分析.4年过去了,各种raft协议的讲解铺天盖地,raft也确实得到了广泛的应用.其中最知名的应用莫 ...

  7. Java开发从初级到中级

    本人正统软件工程专业毕业,虽然实力垫底,但是大学的时候,整个学校非常热衷于OJ,ACM之类,耳濡目染,自以为基础的知识是有的.但是 一直觉得学的东西都是一团浆糊,按照老师的话说,我是那种看书只看目录, ...

  8. Kubernetes服务之“运行单实例的有状态服务”

    目标 在你的环境中创建一个PV 创建一个MySQl的Deployment 在集群中以DNS名称的方式,将MySQL暴露给其他的pod 开始之前 你需要一个Kubernetes集群,一个可以连接到集群的 ...

  9. Java开发环境的搭建及配置

    1.首先下载并安装jdk,jdk和jre最好安装在同一文件夹的不同目录文件中,jdk安装完后就是进行环境变量的配置. JDK的环境变量配置: (1)新建变量JAVA_HOME ,    值为 jdk安 ...

  10. Odoo之Field

    字段描述符包含了字段的定义,下面是实例化一个字段时的属性: class Field(object): :param string: 字段标签(用户所见),如果不设置ORM将取用类的字段名(大写).:p ...