[编程题] 分田地

牛牛和 15 个朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成 16 份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地, 作为牛牛最好的朋友,你希望牛牛取得的田地的价值和尽可能大,你知道这个值最大可以是多少吗?

输入描述:
每个输入包含 1 个测试用例。每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 75),表示田地的大小,接下来的 n 行,每行包含 m 个 0-9 之间的数字,表示每块位置的价值。
输出描述:
输出一行表示牛牛所能取得的最大的价值。
输入例子:
4 4
3332
3233
3332
2323
输出例子:
2

import java.util.*;
public class Main{

public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int m=sc.nextInt();
int [][] arr=new int[n][m];
for(int i=0;i<n;i++){
String s=sc.next();
for(int j=0;j<m;j++){
arr[i][j]=Integer.parseInt(s.substring(j,j+1));
}
}
System.out.println(getMax(arr,n,m));
}
sc.close();
}

public static int getMax(int [][] arr,int n,int m){
int res=0;
int [][] dp=new int[n+1][m+1];//dp[i][j]:从(0,0)到(i-1,j-1)的所有数的和
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
dp[i][j]=dp[i-1][j]+dp[i][j-1]+arr[i-1][j-1]-dp[i-1][j-1];
}
}
int l=0;
int r=dp[n][m];
while(l<=r){
int mid=(l+r)/2;
if(check(dp,mid)){
l=mid+1;
res=mid;
}else{
r=mid-1;
}
}
return res;
}

public static boolean check(int [][] dp,int key){
int n=dp.length;
int m=dp[0].length;
for(int i=1;i<n-3;i++){
for(int j=i+1;j<n-2;j++){
for(int k=j+1;k<n-1;k++){//注意数组的界限,横着最后一刀,后面必须至少留一个元素
int cnt=0;int last=0;
for(int l=1;l<m;l++){//同理,纵着切时,最后面也要留一个元素,因此不能取到m
int s1=calc(dp,0,last,i,l);
int s2=calc(dp,i,last,j,l);
int s3=calc(dp,j,last,k,l);
int s4=calc(dp,k,last,n-1,l);//同理不能取到n
if(s1>=key&&s2>=key&&s3>=key&&s4>=key){
last=l;
cnt++;
}
}
if(cnt>=4){
return true;
}
}
}
}
return false;
}
public static int calc(int[][] dp,int preX,int preY,int nowX,int nowY){
return dp[nowX][nowY]-dp[preX][nowY]-dp[nowX][preY]+dp[preX][preY];
}
}

时间: 2024-12-25 04:18:48

[编程题] 分田地的相关文章

网易2017春招[编程题]分饼干@Java

o6b19TK菜3孤Whttp://www.docin.com/app/user/userinfo?userid=178838282 eO白懊窒1瘫9肯3钠E山段http://huiyi.docin.com/hwhx2495 53k腾7懦95泛纤3Vhttp://tushu.docin.com/sina_5847498140 柑5v课9N1缴遮9毖Fhttp://www.docin.com/app/user/userinfo?userid=179253259 h3G伟t涝r焉布7R9http:/

程序设计入门—Java语言 第六周编程题 1 单词长度(4分)

第六周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 1 单词长度(4分) 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's"算一个单词,长度为4.注意,行中可能出现连续的空格. 输入格式: 输入在一行中给出一行文本,以'.'结束,结尾的句号不能计算在最后一个单词的长度内. 输出格式: 在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后

中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机

期末考试编程题 返回 这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 细胞自动机(30分) 题目内容: 这是细胞自动机的非图形版本.细胞自动机是指在一个二维网格内,每一个网格是一个细胞.每个细胞有活和死两种状态. 初始时刻,有些细胞是活的,有些细胞是死的.自动机的每一步,根据每个细胞周围8个格子内的其他细胞的生存情况决定这个细胞下一步是否存活.具体的规则如下:

搜狐2016研发工程师编程题

1.[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列.

编程题:学生成绩评分

#include<stdio.h> void main() {   int score; printf("请输入学生分数:"); scanf("%d",&score); switch(score/10) {  case 10: case 9:printf("成绩优秀\n"); break;     /*成绩在90~100分*/ case 8:printf("成绩良好\n"); break;     /*成绩

编程题集

编程题集 ps: 如题目有错请及时反馈 2015/7/10    scanf.printf的基本用法.变量的定义和使用.C语言的各种运算符 ------------------------------------------------------------------------------------- 程序篇: #1编写一个程序,输出 "Hello World" . #2编写一个程序,实现简单的加减乘除运算. #3让用户输入两个整数,然后调换位置后输出. #4输入年,月,日,把

C++继承与多态编程题

要求编写一个简单的人员信息管理程序,具体要求如下: (1)程序涉及到五个类,分别是employee,technician,salesman,manager,salsemanager.这五个类的关系为:employee是顶层父类,technician,salesman,manager是employee的子类,salsemanager是salesman,manager的子类. (2)employee具有员工号,姓名,收入等属性,有设置姓名,获取姓名,获取员工号,获取收入等函数. (3)technic

中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零

期末考试的编程题 返回 这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 二进制的前导的零(10分) 题目内容: 计算机内部用二进制来表达所有的值.一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000.可以看到,从左边数过来,在第一个1之前,有27

上机操作编程题

一.写一个简单的缓存系统 1 package com.wisezone.demo; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 /** 6 * 上机操作: 7 * 面试题--写一个简单的缓存系统 8 * @author 王东海 9 * @2017年6月5日 10 */ 11 public class CacheDemo 12 { 13 private Map<String, Object> map = new HashMap&