topcoder srm 315 div1

topcoder srm 315 div1

problem1  link

直接模拟即可。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;

public class DigitsSum {
	
	public int lastDigit(int n) {
		while(n>=10) {
			int s=0;
			while(n!=0) {
				s+=n%10;
				n/=10;
			}
			n=s;
		}
		return n;
	}
}

 problem2 link

暴力搜索,记忆搜过的状态。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;

public class SillySudoku {

	Map<Long,Integer> map=null;

	long gethash(Integer[][] a) {
		long x=0;
		for(int i=0;i<4;++i) {
			for(int j=0;j<4;++j) {
				x=x*10+a[i][j];
			}
		}
		return x;
	}

	boolean check(Integer[][] a,int x,int y) {
		for(int i=0;i<4;++i) {
			if(i!=y&&a[x][i]==a[x][y]) {
				return false;
			}
			if(i!=x&&a[i][y]==a[x][y]) {
				return false;
			}
		}
		for(int i=x/2*2;i<x/2*2+2;++i) {
			for(int j=y/2*2;j<y/2*2+2;++j) {
				if(i==x&&j==y) continue;
				if(a[x][y]==a[i][j]) {
					return false;
				}
			}
		}
		return true;
	}


	int dfs(Integer[][] a,int x,int y) {
		if(y==4) {
			++x;
			y=0;
		}
		if(x==4) {
			return 1;
		}
		long h=gethash(a);
		if(map.containsKey(h)) {
			return map.get(h);
		}
		if(a[x][y]!=0) {
			int result=check(a,x,y)?dfs(a,x,y+1):0;
			map.put(h,result);
			return result;
		}

		int result=0;

		for(int i=1;i<=4;++i) {
			a[x][y]=i;
			if(check(a,x,y)) {
				result+=dfs(a,x,y+1);
			}
			a[x][y]=0;
		}
		map.put(h,result);
		return result;
	}

	public int countWays(String[] board) {
		map=new HashMap<>();

		Integer[][] a=new Integer[4][4];
		for(int i=0;i<4;++i) {
			for(int j=0;j<4;++j) {
				if(board[i].charAt(j)=='-') {
					a[i][j]=0;
				}
				else {
					a[i][j]=(int)(board[i].charAt(j)-'0');
				}
			}
		}

		return dfs(a,0,0);
	}
}

problem3 link

三个矩形的位置有六种情况:

(1)右侧一个,左侧上下两个;

(2)左侧一个,右侧上下两个;

(3)左中右三个;

(4)上面左右两个,下面一个;

(5)上面一个,下面左右两个;

(6)上中下三个。

所以预处理并保存以(i,j)为右下角,左下角,右上角,左上角的区域内可选出的最优矩形,这样就能轻松地解决(1)(2)(4)(5)四种情况。对于第(3)(6)两种情况,首先枚举两条分界线,分界线中间的这一块不能直接得到结果,只能暴力。所以最大的复杂度是$30^{4}$

import java.util.*;
import java.math.*;
import java.util.regex.Matcher;

import static java.lang.Math.*;

public class ThreeMines {

	int n,m;
	int[][] a=null;
	int[][] b=null;

	int[][] rb=null;
	int[][] lb=null;
	int[][] lu=null;
	int[][] ru=null;


	int max(int ...a) {
		int ans=Integer.MIN_VALUE;
		for(int i=0;i<a.length;++i) {
			ans=Math.max(ans,a[i]);
		}
		return ans;
	}

	int calsum(int x0,int y0,int x1,int y1) {
		return b[x1][y1]-b[x1][y0-1]-b[x0-1][y1]+b[x0-1][y0-1];
	}

	void calrb() {
		rb=new int[n+1][m+1];
		for(int i=1;i<=n;++i) {
			for(int j=1;j<=m;++j) {
				rb[i][j]=Integer.MIN_VALUE;
				for(int x=1;x<=i;++x) {
					for(int y=1;y<=j;++y) {
						rb[i][j]=max(rb[i][j],calsum(x,y,i,j));
					}
				}
				if(i>1) rb[i][j]=max(rb[i][j],rb[i-1][j]);
				if(j>1) rb[i][j]=max(rb[i][j],rb[i][j-1]);
			}
		}
	}

	void callb() {
		lb=new int[n+1][m+1];
		for(int i=1;i<=n;++i) {
			for(int j=m;j>=1;--j) {
				lb[i][j]=Integer.MIN_VALUE;
				for(int x=1;x<=i;++x) {
					for(int y=m;y>=j;--y) {
						lb[i][j]=max(lb[i][j],calsum(x,j,i,y));
					}
				}
				if(i>1) lb[i][j]=max(lb[i][j],lb[i-1][j]);
				if(j<m) lb[i][j]=max(lb[i][j],lb[i][j+1]);
			}
		}
	}
	void callu() {
		lu=new int[n+1][m+1];
		for(int i=n;i>=1;--i) {
			for(int j=m;j>=1;--j) {
				lu[i][j]=Integer.MIN_VALUE;
				for(int x=n;x>=i;--x) {
					for(int y=m;y>=j;--y) {
						lu[i][j]=max(lu[i][j],calsum(i,j,x,y));
					}
				}
				if(i<n) lu[i][j]=max(lu[i][j],lu[i+1][j]);
				if(j<m) lu[i][j]=max(lu[i][j],lu[i][j+1]);
			}
		}
	}

	void calru() {
		ru=new int[n+1][m+1];
		for(int i=n;i>=1;--i) {
			for(int j=1;j<=m;++j) {
				ru[i][j]=Integer.MIN_VALUE;
				for(int x=n;x>=i;--x) {
					for(int y=1;y<=j;++y) {
						ru[i][j]=max(ru[i][j],calsum(i,y,x,j));
					}
				}
				if(i<n) ru[i][j]=max(ru[i][j],ru[i+1][j]);
				if(j>1) ru[i][j]=max(ru[i][j],ru[i][j-1]);
			}
		}
	}

	int cal1() {
		int ans=Integer.MIN_VALUE;
		for(int j=1;j<m;++j) {
			for(int i=1;i<n;++i) {
				ans=max(ans,rb[i][j]+ru[i+1][j]+lb[n][j+1]);
			}
		}
		return ans;
	}
	int cal2() {
		int ans=Integer.MIN_VALUE;
		for(int j=1;j<m;++j) {
			for(int i=1;i<n;++i) {
				ans=max(ans,rb[n][j]+lb[i][j+1]+lu[i+1][j+1]);
			}
		}
		return ans;
	}
	int cal3() {
		int ans=Integer.MIN_VALUE;
		for(int i=1;i<m;++i) {
			for(int j=i+1;j<m;++j) {
				int premax=Integer.MIN_VALUE;
				for(int k=1;k<=n;++k) {
					for(int x=1;x<=k;++x) {
						premax=max(premax,calsum(x,i+1,k,j));
					}
				}
				ans=max(ans,rb[n][i]+premax+lb[n][j+1]);
			}
		}
		return ans;
	}
	int cal4() {
		int ans=Integer.MIN_VALUE;
		for(int i=1;i<n;++i) {
			for(int j=1;j<m;++j) {
				ans=max(ans,rb[i][j]+lb[i][j+1]+ru[i+1][m]);
			}
		}

		return ans;
	}
	int cal5() {
		int ans=Integer.MIN_VALUE;
		for(int i=1;i<n;++i) {
			for(int j=1;j<m;++j) {
				ans=max(ans,rb[i][m]+ru[i+1][j]+lu[i+1][j+1]);
			}
		}
		return ans;
	}

	int cal6() {
		int ans=Integer.MIN_VALUE;
		for(int i=1;i<n;++i) {
			for(int j=i+1;j<n;++j) {
				int premax=Integer.MIN_VALUE;
				for(int k=1;k<=m;++k) {
					for(int y=1;y<=k;++y) {
						premax=max(premax,calsum(i+1,y,j,k));
					}
				}
				ans=max(ans,rb[i][m]+premax+ru[j+1][m]);
			}
		}
		return ans;
	}
	
	public int maximumProfit(String[] field) {
		n=field.length;
		m=field[0].length();
		a=new int[n+1][m+1];
		for(int i=0;i<n;++i) {
			for(int j=0;j<m;++j) {
				char c=field[i].charAt(j);
				if('a'<=c&&c<='z') {
					a[i+1][j+1]=(int)(c-'a');
				}
				else {
					a[i+1][j+1]=(int)('A'-c);
				}
			}
		}
		b=new int[n+1][m+1];
		for(int i=1;i<=n;++i) {
			for(int j=1;j<=m;++j) {
				b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j];
			}
		}
		calrb();
		callb();
		callu();
		calru();
		int ans=Integer.MIN_VALUE;
		ans=max(ans,cal1());
		ans=max(ans,cal2());
		ans=max(ans,cal3());
		ans=max(ans,cal4());
		ans=max(ans,cal5());
		ans=max(ans,cal6());
		return ans;
	}
}

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101195.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 100+Python编程题给你练(附答案)

    大家如果能坚持独立思考完成以下题目,一定可以帮大家轻松getPython的编程技能。目前,这个项目已经获得了3994Stars,2952Forks。Github地址:Python-programming-exercises首先,这100+练习题根据难易程度分为三个等级:Level1、2和3。下面对如何定义这三个Level进行了说明,大家可以结合自身的学习能…

    2022年4月4日
    109
  • 高级java面试题及答案_java高级面试题大汇总

    高级java面试题及答案_java高级面试题大汇总一、参考资料不容错过的Java高级面试题_帝都的雁的博客-CSDN博客_java高级面试题java面试题汇总(上)_Oliverfly1的博客-CSDN博客_java面试题史上最全的中高级JAVA工程师面试题汇总有哪些?-知乎DevBooks:2021面试题,Java面试题、JVM面试题、多线程面试题、并发编程、设计模式面试题、SpringBoot面试题、SpringCloud面试题、MyBatis面试题-Gitee.com2021年Java高级面试题总结_m0_57699

    2022年8月20日
    10
  • PyCharm激活码永久有效PyCharm2021.3.1激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2021.3.1激活码教程-持续更新,一步到位PyCharm激活码永久有效2021.3.1激活码教程-Windows版永久激活-持续更新,Idea激活码2021.3.1成功激活

    2022年6月19日
    131
  • 多个单列索引和联合索引的区别详解

    多个单列索引和联合索引的区别详解背景:为了提高数据库效率,建索引是家常便饭;那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。一、联合索引测试注:Mysql版本为5.7.20创建测试表(表记录数为63188):CREATETABLE`t_mobilesms_11`(`id`bigint(20)NOT…

    2022年6月4日
    46
  • jmeter性能测试步骤入门_jmeter接口性能测试

    jmeter性能测试步骤入门_jmeter接口性能测试原文转自:https://blog.csdn.net/lovesoo/article/details/78579547ApacheJMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。本文为JMeter性能测试完整入门篇,从Jmeter下载安装到编写一个完整…

    2022年10月4日
    1
  • Java面向对象三大特征的理解

    Java面向对象三大特征的理解面向对象三大特征的理解初始理解封装继承多态初始理解其实这些知识很早就有接触,而且一些概念也牢记于心了。自己叙述面向对象的特征会是这样的:面向对象的三大特征是封装、继承和多态。封装是对代码的封装以实现迪内聚高耦合的设计,使代码更安全且具有良好的扩展性。继承是父类产生子类的过程,子类可以使用父类的非私有的属性和方法。多态是一个对象在不同时刻可以表现出不同状态的现象。外加Animal和Cat的例子。这一段时间敲了不少的Java代码,在敲代码的过程中想了无数次的面向对象这几个概念,对他们有了更深的了解,在这

    2022年7月15日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号