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 ...
随机推荐
- JSP学习(3)
JSP学习(3) JSP内置对象 Web容器创建的一组对象,不使用new关键字就可以使用的内置对象 用户服务器请求 缓冲区:Buffer,就是内存的一块区域,用来保存临时数据. get与post的区别 ...
- linux创建相关待同步目录
[root@rsync-server-1 ~]# mkdir /data/{web,web_data}/redhat.sx -p [root@rsync-server-1 ~]# tree /data ...
- tomcat日志切割脚本shell
tomcat-rotate.sh: #!/bin/bash log_path="/home/tomcat7-api/logs/"expried_time=7 function de ...
- Express 中配置使用 art-template模板引擎
art-template 官网 https://aui.github.io/art-template/ 安装: npm install --save art-template npm install ...
- MongoDB的应用
一.MongoDB后台管理 # ./mongo MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 MongoD ...
- C++11的新特性:右值引用
先看代码 #include "pch.h" #include <iostream> #include <string> using namespace st ...
- CF 82 D.Two out of Three
前言 全网唯一不同题解 设 \(f[i][j]\) 表示第 \(i\) 次选取留下来的数是 \(k\) 的最小花费 枚举前面的留下来的点 \(k\) 当前能留下的点只有 \((2*i),(2*i+1) ...
- windows下laravel 快速安装
1. 安装composer https://getcomposer.org/ 2. 安装git windows 客户端工具 https://git-scm.com/downloads 3. 更改co ...
- flask之数据库的交互
一:关系型数据库 mysql Flask-SQLAlchemy管理关系型数据库. mysql数据库引擎:url : mysql://username:passowrd@hostname/databas ...
- Linux学习-MySQL的主从复制高可用性解决方案MHA
一.MHA简介 1.MHA Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点:通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现, ...