题目描述

有这样一款新的坦克游戏。在游戏中,你将操纵一辆坦克,在一个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 坦克游戏(决策单调性分治)的更多相关文章

  1. BZOJ1897 : tank 坦克游戏

    设$f[i][j][k]$表示坦克位于$(i,j)$,目前打了不超过$k$个位置的最大得分. 初始值$f[1][1][k]$为在$(1,1)$射程内最大$k$个位置的分数总和. 对于每次移动,会新增一 ...

  2. P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)

    P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...

  3. 4951: [Wf2017]Money for Nothing 决策单调性 分治

    Bzoj4951:决策单调性 分治 国际惯例题面:一句话题面:供应商出货日期为Ei,售价为Pi:用户收购截止日期为Si,收购价格为Gi.我们要求max((Si-Ej)*(Gi-Pj)).显然如果我们把 ...

  4. [NAIPC2016]Jewel Thief(决策单调性+分治)

    [NAIPC2016]Jewel Thief(决策单调性+分治) 题面 原题提交地址(题目编号H) 原题面下载地址 有\(n\)个物品,每个物品有一个体积\(w_i\)和价值\(v_i\),现在要求对 ...

  5. 1897. tank 坦克游戏

    传送门 显然考虑 $dp$,发现时间只和当前位置和攻击次数有关,设 $F[i][j][k]$ 表示当前位置为 $i,j$ ,攻击了 $k$ 次得到的最大分数 初始 $f[1][1][k]$ 为位置 $ ...

  6. P3515 [POI2011]Lightning Conductor(决策单调性分治)

    P3515 [POI2011]Lightning Conductor 式子可转化为:$p>=a_j-a_i+sqrt(i-j) (j<i)$ $j>i$的情况,把上式翻转即可得到 下 ...

  7. [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)

    显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...

  8. [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治

    https://loj.ac/problem/6039 我们设dp[i][j]表示考虑所有价值小于等于i的物品,带了j块钱的最大吸引力. 对于ci相同的物品,我们一定是从大到小选k个物品,又发现最大的 ...

  9. bzoj4518: [Sdoi2016]征途(DP+决策单调性分治优化)

    题目要求... 化简得... 显然m和sum^2是已知的,那么只要让sigma(si^2)最小,那就变成了求最小平方和的最小值,经典的决策单调性,用分治优化即可. 斜率优化忘得差不多就不写了 #inc ...

随机推荐

  1. Oracle11gR2 64bit+Oracle11gR2Client32bit+pl/sql 9

    安装Oracle数据库,费了老一番折腾准备软件:1. Oracle 11g R2 64bit2. Oracle 11g R2 Client 32bit3. PLSQL Developer V9 逐个安 ...

  2. goland使用:导入一个github开源项目tidb

    概要:在windos下的IDEA 的go语言的编辑器 goland的使用,导入github上面的开源项目. 问题: 下载好goland之后,open project打开一个下载好的githubhub项 ...

  3. LINUX VSFTP配置及安装

    ------------------转载:亲身实践,确实好用(http://www.cnblogs.com/jack-Star/p/4089547.html) 1.VSFTP简介 VSFTP是一个基于 ...

  4. no hash tools

    import itertools class Set(list):    def __init__(self, params):        super(Set, self).__init__()  ...

  5. php $_SERVER 中的 QUERY_STRING和REQUEST_URI

    index.php <?php print_r($_GET); parse_str($_SERVER['QUERY_STRING'],$get); print_r($get); print_r( ...

  6. AOP技术介绍--(AOP技术基础)

    2.1 AOP技术起源        AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分 ...

  7. [洛谷P3145] CQOI2009 循环赛

    问题描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入格式 第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分. 输出格式 ...

  8. 洛谷 P1407 稳定婚姻

    问题描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关.25岁的姗姗和男友谈恋爱半年就结婚,结婚不到两 ...

  9. POJ 1797 Heavy Transprotation ( 最短路变形 || 最小生成树 )

    题意 : 找出 1 到 N 点的所有路径当中拥有最大承载量的一条路,输出这个最大承载量!而每一条路的最大承载量由拥有最大承载量的那一条边决定 分析 : 与 POJ 2253 相似且求的东西正好相反,属 ...

  10. 牛客:t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数(数论+贪心)

    https://ac.nowcoder.com/acm/contest/907/B t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数 分析: 根据约数和定理:对于一个大于1正整数 ...