【JZOJ4930】【NOIP2017提高组模拟12.18】C
题目描述
给出一个H的行和W列的网格。第i行第j列的状态是由一个字母的A[i][j]表示,如下: 
“.”    此格为空。 
“o”   此格包含一个机器人。 
“E”   此格包含一个出口,保证出口在整个网格中有且只有一个 
每次可以选择上,下,左,右之一的方向,将所有剩余的机器人向这个方向移动一个格子,如果一个机器人被移出了网格,那么这个机器人会爆炸,并立即消失。如果一个机器人移动到出口所在的格子,机器人将获救,并消失,最多有多少机器人获救。
数据范围
对于100%的数据,n,m<=100
=w=
设f[i][j][k][l]表示,已经牺牲掉上面的i行,下面的k行,左边的j行,以及右边的l行的最大机器人数。 
方程易推。
代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const char* fin="aP3.in";
const char* fout="aP3.out";
const int inf=0x7fffffff;
const int maxn=107;
int n,m,i,j,k,l,ans,tot;
char a[maxn][maxn];
int sum[maxn][maxn];
int ex,ey;
int f[2][maxn][maxn][maxn],v;
int getsum(int sx,int sy,int tx,int ty){
    if (sx>tx || sy>ty) return 0;
    return sum[tx][ty]-sum[sx-1][ty]-sum[tx][sy-1]+sum[sx-1][sy-1];
}
int main(){
    scanf("%d%d\n",&n,&m);
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++){
            a[i][j]=getchar();
            if (a[i][j]=='o'){
                sum[i][j]=1;
            }else if (a[i][j]=='E'){
                ex=i;
                ey=j;
            }
            sum[i][j]=sum[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
        }
        scanf("\n");
    }
    v=0;
    for (i=0;i<=n;i++){
        memset(f[1-v],0,sizeof(f[1-v]));
        for (j=0;j<=m;j++)
            for (k=0;k<=n;k++)
                for (l=0;l<=m;l++){
                    if (ex+i>n || ex-k<1 || ey+j>m || ey-l<1) continue;
                    //if (ex<i || ex>n-k || ey<j || ey>m-l) continue;
                    if (ex+i+1<=n-k) f[1-v][j][k][l]=max(f[1-v][j][k][l],f[v][j][k][l]+getsum(ex+i+1,max(j+1,ey-l),ex+i+1,min(m-l,ey+j)));
                    if (ey+j+1<=m-l) f[v][j+1][k][l]=max(f[v][j+1][k][l],f[v][j][k][l]+getsum(max(i+1,ex-k),ey+(j+1),min(n-k,ex+i),ey+(j+1)));
                    if (ex-k-1>=1+i) f[v][j][k+1][l]=max(f[v][j][k+1][l],f[v][j][k][l]+getsum(ex-(k+1),max(j+1,ey-l),ex-(k+1),min(m-l,ey+j)));
                    if (ey-l-1>=1+j) f[v][j][k][l+1]=max(f[v][j][k][l+1],f[v][j][k][l]+getsum(max(i+1,ex-k),ey-(l+1),min(n-k,ex+i),ey-(l+1)));
                    ans=max(ans,f[v][j][k][l]);
                }
        v=1-v;
    }
    printf("%d",ans);
    return 0;
}
=o=
事实上,比赛中我已经注意到,如果强制某个机器人获救的话,必然牺牲的是连续的数行或数列。 
利用这一点,就可以推出,对当前场面有影响的,就是上下左右四个方向牺牲的行列数。 
由于n,m<=100,所以加上剪枝,O(n4)的动态规划是可行的。
可惜我当时直往搜索的方向想,结果什么都没搞成。
这启示说,如果找到了代表某种场面,只需要很少参数的话,就可以利用动态规划了。
【JZOJ4930】【NOIP2017提高组模拟12.18】C的更多相关文章
- 【JZOJ4929】【NOIP2017提高组模拟12.18】B
		
题目描述 在两个n*m的网格上染色,每个网格中被染色的格子必须是一个四联通块(没有任何格子被染色也可以),四联通块是指所有染了色的格子可以通过网格的边联通,现在给出哪些格子在两个网格上都被染色了,保证 ...
 - 【JZOJ4928】【NOIP2017提高组模拟12.18】A
		
题目描述 数据范围 对于100%的数据,n<=100000,1<=A[i]<=5000 =w= Ans=∏1ai 代码 #include<iostream> #inclu ...
 - 【NOIP2017提高组模拟12.24】B
		
题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...
 - 【NOIP2017提高组模拟12.17】环
		
题目 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和,求 ...
 - 求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)
		
前言 本人在此题有一种不是题解的方法,但无法证明也找不到反例. 如果各位大神有反例或证明请发至 邮箱:qq1350742779@163.com Description Alice和Bob有一棵树(无根 ...
 - 【NOIP2017提高组模拟12.10】幻魔皇
		
题目 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白色节 ...
 - 【NOIP2017提高组模拟12.10】神炎皇
		
题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...
 - 【JZOJ4922】【NOIP2017提高组模拟12.17】环
		
题目描述 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和 ...
 - 【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢
		
题目描述 Alice和Bob有一棵树(无根.无向),在第i个点上有ai个巧克力.首先,两人个选择一个起点(不同的),获得点上的巧克力:接着两人轮流操作(Alice先),操作的定义是:在树上找一个两人都 ...
 
随机推荐
- EPSG、SRID、WKT的概念
			
转自:http://www.cnblogs.com/jackdong/archive/2010/12/20/1911558.html EPSG:European Petroleum Survey Gr ...
 - 深入浅出 Java Concurrency (18): 并发容器 part 3 ConcurrentMap (3)[转]
			
在上一篇中介绍了HashMap的原理,这一节是ConcurrentMap的最后一节,所以会完整的介绍ConcurrentHashMap的实现. ConcurrentHashMap原理 在读写锁章节部分 ...
 - PAT甲级——A1041 Be Unique
			
Being unique is so important to people on Mars that even their lottery is designed in a unique way. ...
 - 【DM642学习笔记三】flash的烧写
			
ICETEK-DM642-PCI板上的29L008B芯片提供了8M位的Flash空间(访问地址空间是CE1,90000000h~90080000h).主要用于自启动功能和存储FPGA的配置数据. 一. ...
 - 【DM642学习笔记六】TI参考文档--DM642 Video Port Mini Driver
			
这个文档介绍了在DM642EVM板上视频采集和显示微驱动的使用和设计.用EDMA进行存储器和视频端口的数据传输.为了增强代码的复用性和简化设计过程,驱动分为通用视频端口层和特定编解码芯片微驱动层两个 ...
 - 关于UML类图的一点理解(转)
			
首先我们定义一个非常简单的Person类,代码如下: public class Person { private String name; private int age =1; public Str ...
 - LINUX查询用户命令
			
W 可显示开机多久,当前登录的所有用户,平均负载 Who 显示当前登录的所有用户 Last 显示每个用户最后的登录时间 Lastlog 显示每个用户最后的登录时间
 - 差分进化算法(DE)的C++面向对象方法实现
			
代码来源于网络,写得非常棒 /*DE_test *对相应的Matlab程序进行测试 */ #include <iostream> #include <cmath> #inclu ...
 - 解决pip安装过慢的问题
			
1.pip install scipy -i https://pypi.douban.com/simple/ 2.pip install --index https://pypi.mirrors.us ...
 - Django项目:CRM(客户关系管理系统)--20--12PerfectCRM实现King_admin分页上下页
			
{#table_data_list.html#} {## ————————08PerfectCRM实现King_admin显示注册表的字段表头————————#} {% extends 'king_m ...