bzoj1897. tank 坦克游戏(决策单调性分治)
题目描述
有这样一款新的坦克游戏。在游戏中,你将操纵一辆坦克,在一个N×M的区域中完成一项任务。在此的区域中,将会有许多可攻击的目标,而你每摧毁这样的一个目标,就将获得与目标价值相等的分数。只有获得了最高的分数,任务才算完成。同时,为了增加游戏的真实性和难度,该游戏还做了以下的限制:
1)坦克有射程r的限制。为方便计算,射程r规定为:若坦克位于(x, y)格,则它可攻击的目标(x1, y1)必须满足|x-x1|, |y-y1|∈[0, r]。
2)对坦克完成任务的时间有严格限制,规定为t秒。其中,坦克每进行一次移动都需1秒的时间,每攻击一个目标也需1秒的时间。时间一到t秒,便对此次任务进行记分。
3)坦克最初位于左上角,且移动方向只准是向右或向下,每次只允许移动一格。
在以上的限制条件下,要完成该任务便成为了一件很难事情。因此,你必须为此编写一个程序,让它助你完成这个艰巨的任务。
输入格式
第一行四个整数N、M、r、t,分别表示区域的长、宽,以及射程和完成任务时间。
接下来N行是一个N×M的矩阵,对应每个位置上目标的价值。
输出格式
输出文件仅一个数max,即该任务中可得到的最高分数。
样例
样例输入
5 5 2 7
0 5 0 0 4
0 0 0 0 2
0 0 0 0 0
0 0 0 0 0
5 0 3 0 11
样例输出
21
数据范围与提示
1≤N、M≤500,1≤r≤100,1≤t≤250。
对于20%的数据有:1≤N、M≤10。
对于60%的数据有:1≤N、M≤50,1≤r≤10。
对于80%的数据有:1≤N、M≤100,1≤r≤20。
设$f[i][j][k]$表示到$(i,j)$为止打$k$个的最大价值
注意到每步打目标的个数一定是单调不降的
证明....挂一神犇的blog
每次转移时用决策单调性分治优化
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define re register
using namespace std;
int read(){
char c=getchar(); int x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return x;
}
#define N 505
int cmp(int A,int B){return A>B;}
int n,m,R,T,ans,k=,a[N][N],f[][N][],h[N*N],tp,g[N],v[N];
void solve(int l,int r,int dl,int dr){
if(l>r||dl>dr) return ;
int mm=(l+r)/,dm=dl;
for(int i=dl;i<=min(mm,dr);++i)
if(v[mm]<g[mm-i]+h[i])
v[mm]=g[mm-i]+h[i],dm=i;
solve(l,mm-,dl,dm);
solve(mm+,r,dm,dr);
}
int main(){
n=read(); m=read(); R=read(); T=read();
for(re int i=;i<=n;++i)
for(re int j=;j<=m;++j)
a[i][j]=read();
for(re int i=;i<=R+;++i)
for(re int j=;j<=R+;++j)
if(a[i][j]) h[++tp]=a[i][j];
sort(h+,h+tp+,cmp); tp=min(tp,T);//注意最多取T个
for(re int i=;i<=tp;++i) f[][][i]=f[][][i-]+h[i];
int _n=max(,n-R),_m=max(,m-R);
for(re int i=;i<=_n;++i,k^=)
for(re int j=;j<=_m;++j){
int lim=T-i-j+;
if(lim<=) continue;
if(i>){
for(re int u=;u<=lim;++u) v[u]=g[u]=f[k^][j][u];
tp=;
for(re int u=max(,j-R);u<=min(m,j+R);++u)
if(a[i+R][u]) h[++tp]=a[i+R][u];
sort(h+,h+tp+,cmp);
for(re int u=;u<=tp;++u) h[u]+=h[u-];
solve(,lim,,tp);
for(re int u=;u<=lim;++u) f[k][j][u]=max(f[k][j][u],v[u]);
}
if(j>){
for(re int u=;u<=lim;++u) v[u]=g[u]=f[k][j-][u];
tp=;
for(re int u=max(,i-R);u<=min(n,i+R);++u)
if(a[u][j+R]) h[++tp]=a[u][j+R];
sort(h+,h+tp+,cmp);
for(re int u=;u<=tp;++u) h[u]+=h[u-];
solve(,lim,,tp);
for(re int u=;u<=lim;++u) f[k][j][u]=max(f[k][j][u],v[u]);
}
while(lim) ans=max(ans,f[k][j][lim--]);
}
printf("%d",ans);
return ;
}
bzoj1897. tank 坦克游戏(决策单调性分治)的更多相关文章
- BZOJ1897 : tank 坦克游戏
设$f[i][j][k]$表示坦克位于$(i,j)$,目前打了不超过$k$个位置的最大得分. 初始值$f[1][1][k]$为在$(1,1)$射程内最大$k$个位置的分数总和. 对于每次移动,会新增一 ...
- P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...
- 4951: [Wf2017]Money for Nothing 决策单调性 分治
Bzoj4951:决策单调性 分治 国际惯例题面:一句话题面:供应商出货日期为Ei,售价为Pi:用户收购截止日期为Si,收购价格为Gi.我们要求max((Si-Ej)*(Gi-Pj)).显然如果我们把 ...
- [NAIPC2016]Jewel Thief(决策单调性+分治)
[NAIPC2016]Jewel Thief(决策单调性+分治) 题面 原题提交地址(题目编号H) 原题面下载地址 有\(n\)个物品,每个物品有一个体积\(w_i\)和价值\(v_i\),现在要求对 ...
- 1897. tank 坦克游戏
传送门 显然考虑 $dp$,发现时间只和当前位置和攻击次数有关,设 $F[i][j][k]$ 表示当前位置为 $i,j$ ,攻击了 $k$ 次得到的最大分数 初始 $f[1][1][k]$ 为位置 $ ...
- P3515 [POI2011]Lightning Conductor(决策单调性分治)
P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...
- [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...
- [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治
https://loj.ac/problem/6039 我们设dp[i][j]表示考虑所有价值小于等于i的物品,带了j块钱的最大吸引力. 对于ci相同的物品,我们一定是从大到小选k个物品,又发现最大的 ...
- bzoj4518: [Sdoi2016]征途(DP+决策单调性分治优化)
题目要求... 化简得... 显然m和sum^2是已知的,那么只要让sigma(si^2)最小,那就变成了求最小平方和的最小值,经典的决策单调性,用分治优化即可. 斜率优化忘得差不多就不写了 #inc ...
随机推荐
- MySQL 简介
MySQL 简介 点击查看MySQL官方网站 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗 ...
- Linux用户都应该了解的命令行省时技巧
每个Linux用户都应该了解的命令行省时技巧 有网友在问答网站Quora上提问:“有哪些省时小技巧,是每个Linux用户都应该知道的?” Joshua Levy 平常就在 Linux 平台工作,并且他 ...
- Mysql 数据库中9大对象
MySql 数据库9中对象1.表2.索引3.视图4.图表:数据库表之间的关系视图,并不常用5.规则6.缺省值:数据列的默认值7.触发器8.存储过程9.用户
- Spring_搭建过程中遇到的问题
先看一下问题: 1.在web.xml中配置Spring 加载Spring mvc的时候配置如下: <!--配置SpringMVC的前端控制器--> <servlet> < ...
- 03机器学习实战之决策树scikit-learn实现
sklearn.tree.DecisionTreeClassifier 基于 scikit-learn 的决策树分类模型 DecisionTreeClassifier 进行的分类运算 http://s ...
- BZOJ2440/洛谷P4318 [中山市选2011]完全平方数 莫比乌斯函数
题意:找到第k个无平方因子数. 解法:这道题非常巧妙的运用了莫比乌斯函数的性质! 解法参考https://www.cnblogs.com/enzymii/p/8421314.html这位大佬的.这里我 ...
- TypeScript扩展类方法
以数组删除元素为例 javascript数组删除一般是这样 const idx = selectedIDs.findIndex(x => x === deSelected); selectedI ...
- TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片
**TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片首先我们来看看淘宝的功能和样式:** 之后看看制作完成的演示:(由于全部功能弄成GIF有点大,限制上传大小好像在1M之内,压缩之后也有1.9 ...
- 英国已有500万宽带用户接入并开始使用IPv6技术
2018年英国首家为客户提供IPv6的主要ISP.随着所有现有的符合条件的用户线路启用,约90%的固定宽带用户群接入并开始使用IPv6,为IPv6互联网增加了超过500万个新眼球. 英国IPv6项目于 ...
- 【leetcode】1051. Height Checker
题目如下: Students are asked to stand in non-decreasing order of heights for an annual photo. Return the ...