博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU_4939 stupid tower defense 2014多校7 多变量型DP
阅读量:4682 次
发布时间:2019-06-09

本文共 1210 字,大约阅读时间需要 4 分钟。

意思是有个塔防游戏,有三种塔,红塔在怪物经过的时候每秒会产生攻击力大小的伤害,绿塔对怪物经过以及经过之后每秒产生攻击力大小的伤害,还有种蓝塔,对怪物进行减速,即怪物从此之后经过一个单位都会减慢c秒

最后最最大的伤害值是多少

又是比赛的时候没想出来,知道是个DP,但是对这种多变量型的DP就是有点不感冒。这个思想其实也是差不多的,你首先得枚举其中的一个值或者两个值

这里有个特性,我绿塔和蓝塔放越前面越好,红塔放越后面越好(主要是腾前面的位置给另外两种),这用了点贪心技巧,但绝对是对的

所以我们可以枚举某个点 后面全部是放红塔。。。然后我绿塔和蓝塔该怎么处理呢。这个时候我们不能猛想全局,考虑单个点的伤害,前面是绿和蓝,后面是红,这样在这个点所受的伤害,我枚举前面蓝塔有几个,则绿塔就是长度-蓝的数目,这样对该点的伤害我就可以求出来,然后通过i-1过渡出来,就可以得到整个前段受的伤害,再通过直接算出后面红塔的伤害,就可以得出这个状态下受到的总伤害,最后取最大值即可

#include 
#include
#include
#define LL __int64using namespace std;LL dp[1510][1510];int main(){ int w,kase=0; LL n,x,y,z,t; scanf("%d",&w); while (w--) { memset(dp,0,sizeof dp); scanf("%I64d%I64d%I64d%I64d%I64d",&n,&x,&y,&z,&t); LL ans=0; for (int i=1;i<=n;i++){ for (int j=0;j<=i;j++){ if(j
0){ dp[i][j]=max(dp[i][j],dp[i-1][j-1]+((i-j)*z+t)*(j-1)*y); } ans=max(ans,dp[i][j]+((i-j)*z+t)*(n-i)*(x+j*y)); } } ans=max(ans,n*t*x); printf("Case #%d: ",++kase); printf("%I64d\n",ans); }}

  

转载于:https://www.cnblogs.com/kkrisen/p/3933047.html

你可能感兴趣的文章
hdu 1198 Farm Irrigation
查看>>
80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
查看>>
三角洲调平说明
查看>>
线程和进程(Java)
查看>>
PMP CMM
查看>>
day03 bs4解析库之遍历文档树
查看>>
Linux下通过ssh访问另一台内网服务器
查看>>
antd在webpack里面的配置
查看>>
redis 适用场景、缓存选择、java实现
查看>>
国际化问题简述
查看>>
poj2975 Nim
查看>>
.NET面试题系列(十四)锁
查看>>
一个使用 Go 的思维来帮助您构建并开发 Go 应用程序的开源框架
查看>>
.Net并行编程之同步机制
查看>>
iis 站点部署后 Microsof .Net Framework异常
查看>>
解决安全扫描Insecure HTTP Methods Enabled的问题
查看>>
使用jQuery验证用户名是否存在,达到局部刷新的效果
查看>>
团队-学生成绩管理一阶段互评
查看>>
mongodb安装和使用
查看>>
C++Primer笔记-----day01
查看>>