Java实现 蓝桥杯VIP 算法训练 采油区域
算法训练 采油区域
时间限制:2.0s 内存限制:512.0MB
提交此题 查看参考代码
采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井。被拍卖的整块土地为一个矩形区域,被划分为M×N个小块。
Siruseri地质调查局有关于Navalur土地石油储量的估测数据。这些数据表示为M×N个非负整数,即对每一小块土地石油储量的估计值。
为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K块相连的土地构成的正方形区域。
AoE石油联合公司由三个承包商组成,他们想选择三块互不相交的K×K的区域使得总的收益最大。
例如,假设石油储量的估计值如下:
如果K = 2, AoE公司可以承包的区域的石油储量总和为100, 如果K = 3, AoE公司可以承包的区域的石油储量总和为208。
AoE公司雇佣你来写一个程序,帮助计算出他们可以承包的区域的石油储量之和的最大值。
输入格式
输入第一行包含三个整数M, N, K,其中M和N是矩形区域的行数和列数,K是每一个承包商承包的正方形的大小(边长的块数)。接下来M行,每行有N个非负整数表示这一行每一小块土地的石油储量的估计值。
输出格式
输出只包含一个整数,表示AoE公司可以承包的区域的石油储量之和的最大值。
数据规模和约定
数据保证K≤M且K≤N并且至少有三个K×K的互不相交的正方形区域。其中30%的输入数据,M, N≤ 12。所有的输入数据, M, N≤ 1500。每一小块土地的石油储量的估计值是非负整数且≤ 500。
样例输入
9 9 3
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 1 1 1 8 8 8 1 1
1 1 1 1 1 1 8 8 8
1 1 1 1 1 1 9 9 9
1 1 1 1 1 1 9 9 9
样例输出
208
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 采油区域 {
static int map[][];
static int sum[][];
static int kk[][];
static int leftup[][];
static int rightup[][];
static int leftdown[][];
static int rightdown[][];
static int max(int a, int b) {
return a>b?a:b;
}
static void print(int arr[][]) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
System.out.println();
}
public static void main(String args[]) throws IOException {
int M,N,K;
//Scanner in = new Scanner(System.in);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//录入数据
String cs[] = br.readLine().split(" ");
M=Integer.valueOf(cs[0]);
N=Integer.valueOf(cs[1]);
K=Integer.valueOf(cs[2]);
//M=in.nextInt();
//N=in.nextInt();
//K=in.nextInt();
int m = M-K+1;
int n = N-K+1;
map = new int[M+1][N+1];
for(int i=1;i<=M;i++) {
cs = br.readLine().split(" ");
for(int j=1;j<=N;j++) {
//map[i][j]=in.nextInt();
map[i][j]=Integer.valueOf(cs[j-1]);
}
}
//用前缀和计算 sum
sum = new int[M+1][N+1];
for(int i=1;i<=M;i++) {
for(int j=1;j<=N;j++) {
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+map[i][j];
}
}
//用前缀和计算kk
kk = new int[m][n];
for(int i=K;i<=M;i++) {
for(int j=K;j<=N;j++) {
kk[i-K][j-K]=sum[i][j]-sum[i-K][j]-sum[i][j-K]+sum[i-K][j-K];
}
}
//计算四个方向的max
leftup = new int[m][n];
rightup = new int[m][n];
leftdown = new int[m][n];
rightdown = new int[m][n];
leftup[0][0]=kk[0][0];
for(int i=1;i<m;i++)
leftup[i][0]=max(kk[i][0], leftup[i-1][0]);
for(int j=1;j<n;j++)
leftup[0][j]=max(kk[0][j], leftup[0][j-1]);
for(int i=1;i<m;i++) {
for(int j=1;j<n;j++) {
leftup[i][j]=max(kk[i][j], max(leftup[i-1][j], leftup[i][j-1]));
}
}
rightup[0][n-1]=kk[0][n-1];
for(int i=1;i<m;i++)
rightup[i][n-1]=max(kk[i][n-1], rightup[i-1][n-1]);
for(int j=n-2;j>=0;j--)
rightup[0][j]=max(kk[0][j], rightup[0][j+1]);
for(int i=1;i<m;i++) {
for(int j=n-2;j>=0;j--) {
rightup[i][j]=max(kk[i][j], max(rightup[i-1][j], rightup[i][j+1]));
}
}
leftdown[m-1][0]=kk[m-1][0];
for(int i=m-2;i>=0;i--)
leftdown[i][0]=max(kk[i][0], leftdown[i+1][0]);
for(int j=1;j<n;j++)
leftdown[m-1][j]=max(kk[m-1][j], leftdown[m-1][j-1]);
for(int i=m-2;i>=0;i--) {
for(int j=1;j<n;j++) {
leftdown[i][j]=max(kk[i][j], max(leftdown[i][j-1], leftdown[i+1][j]));
}
}
rightdown[m-1][n-1]=kk[m-1][n-1];
for(int i=m-2;i>=0;i--)
rightdown[i][n-1]=max(kk[i][n-1], rightdown[i+1][n-1]);
for(int j=n-2;j>=0;j--)
rightdown[m-1][j]=max(kk[m-1][j], rightdown[m-1][j+1]);
for(int i=m-2;i>=0;i--) {
for(int j=n-2;j>=0;j--) {
rightdown[i][j]=max(kk[i][j], max(rightdown[i+1][j], rightdown[i][j+1]));
}
}
//计算六种情况
int ans=0;
//一
for(int j=0;j<n-2*K;j++) {
for(int i=0;i<m;i++) {
ans = max(ans, leftup[m-1][j]+kk[i][j+K]+rightup[m-1][j+K+K]);
}
}
//|
for(int i=0;i<m-2*K;i++) {
for(int j=0;j<n;j++) {
ans = max(ans, leftup[i][n-1]+kk[i+K][j]+leftdown[i+K+K][n-1]);
}
}
//左
for(int i=0;i<m-K;i++) {
for(int j=0;j<n-K;j++) {
ans = max(ans, leftup[m-1][j]+rightup[i][j+K]+rightdown[i+K][j+K]);
}
}
//右
for(int i=0;i<m-K;i++) {
for(int j=n-1;j-K>0;j--) {
ans = max(ans, leftup[i][j-K]+leftdown[i+K][j-K]+rightup[m-1][j]);
}
}
//上
for(int i=0;i<m-K;i++) {
for(int j=0;j<n-K;j++) {
ans = max(ans, leftup[i][n-1]+leftdown[i+K][j]+rightdown[i+K][j+K]);
}
}
//下
for(int i=K;i<m;i++) {
for(int j=0;j<n-K;j++) {
ans = max(ans, leftup[i-K][j]+rightup[i-K][j+K]+leftdown[i][n-1]);
}
}
System.out.println(ans);
}
}
Java实现 蓝桥杯VIP 算法训练 采油区域的更多相关文章
- Java实现蓝桥杯VIP 算法训练 找公倍数
问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题目要求的输入范例. 样例输出 与上面的样例输入对应的输出. 这道题其实没有什么可写的,但是为了让读者更方便的 ...
- Java实现 蓝桥杯VIP 算法训练 连通分块(并查集)
试题 算法训练 连通分块 资源限制 时间限制:200ms 内存限制:8.0MB 问题描述 连通分块 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 接下来m行,每行2 ...
- Java实现 蓝桥杯VIP 算法训练 无权最长链
试题 算法训练 无权最长链 问题描述 给定一个n节点m边的无圈且连通的图,求直径 输入格式 第一行两个数字n,m 接下来m行每行两个数字x,y,代表x,y之间有一条边 输出格式 要求用户的输出满足的格 ...
- Java实现 蓝桥杯VIP 算法训练 星际交流
算法训练 星际交流 时间限制:1.0s 内存限制:256.0MB 问题描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
- Java实现 蓝桥杯VIP 算法训练 Car的旅行路线
大家可以看一下这个,蓝桥杯官网的这道题是有问题的 Car的旅行路线 算法训练 Car的旅行路线 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 查看参考代码 问题描述 又到暑假 ...
- Java实现 蓝桥杯VIP 算法训练 最大质因数(暴力)
试题 算法训练 最大质因数 问题描述 给出N个数字,求出有最大的最大质因数的那个数 输入格式 第一行:一个整数N. 接下来的N行,每行一个整数A_i,表示给出的那N个数字. 输出格式 第一行:一个整数 ...
- Java实现 蓝桥杯VIP 算法训练 与1连通的点的个数(并查集)
试题 算法训练 与1连通的点的个数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 没有问题描述. 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 ...
- Java实现 蓝桥杯VIP 算法训练 非递归(暴力)
试题 算法训练 非递归 问题描述 当x>1时,Hermite多项式的定义见第二版教材125页.用户输入x和n,试编写"非递归"函数,输出对应的Hermite多项式的值.其中x ...
- Java实现 蓝桥杯VIP 算法训练 步与血(递推 || DFS)
试题 算法训练 步与血 问题描述 有n*n的方格,其中有m个障碍,第i个障碍会消耗你p[i]点血.初始你有C点血,你需要从(1,1)到(n,n),并保证血量大于0,求最小步数. 输入格式 第一行3个整 ...
随机推荐
- 设计模式GOF23大纲
创建型模式: 单例模式,工厂模式,抽象工厂模式 结构型模式: 适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式 行为型模式: 模板方法模式,命令模式,迭代器模式,观察者模式,中介 ...
- Java设计模式之建造者模式(Builder Pattern)
前言 这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点. 一.建造者介绍 用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现 ...
- Luogu P3846 BSGS算法
https://www.luogu.com.cn/problem/P3846 BSGS这个东西是用来干啥的? 形如下面这个式子: \[a^b = c\;(mod\;p) \] 其中:p是一个质数.\( ...
- xilinx VDMA IP核使用
VDMA实用配置说明 VDMA是通过AXI Stream协议对视频数据在PS与PL端进行搬运,开发者无需关注AXI Stream协议,在BlockDesign设计中只需要把相应信号进行连接即可. VD ...
- 【题解】[SCOI2015]小凸玩矩阵
题目链接 思路:题目要求变相解答一下,求出是否有n-k个数,不大于当前求的第k个数 而每一行每一列只能有一个数,就可以得到一个二分图的思路,边上的权值就是第i行第j列这个数的值 对于答案就是第k大的数 ...
- vue v-for 渲染input 输入有问题 解决方案
v-for循环input标签的时候输入信息两个输入框一同显示输入信息 解决方案: <input :placeholder="items.title" v-model = &q ...
- webpack指南(四)shimming
shimming 将一个新的 API 引入到一个旧的环境中,而且仅靠旧的环境中已有的手段实现. ProvidePlugin 我们在程序中暴露一个变量,通知webpack某个库被使用,webpack将在 ...
- 学习Echarts:(二)异步加载更新
这部分比较简单,对图表的异步加载和更新,其实只是异步获取数据然后通过setOption传入数据和配置而已. $.get('data.json').done(function (data) { myCh ...
- 8.2 Go 锁
8.2 Go 锁 案例(坑):多个goroutine操作同一个map. go提供了一种叫map的数据结构,可以翻译成映射,对应于其他语言的字典.哈希表.借助map,可以定义一个键和值,然后可以从map ...
- DPDK Timer Library原理(学习笔记)
0 前置知识学习跳表(SkipList) 跳表应具有以下特征: 1)一个跳表应该有多个层(level)组成,通常是10-20层. 2)跳表的第0层包含所有的元素. 3)每一层都是一个有序的链表.层数越 ...