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;
	}
}

  

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • maven常用打包命令

    maven常用打包命令maven常用打包命令1、mvncompile编译,将Java源程序编译成class字节码文件。2、mvntest测试,并生成测试报告3、mvnclean将以前编译得到的旧的class字节码文件删除4、mvnpakage打包,动态web工程打war包,Java工程打jar包。5、mvninstall将项目生成jar包放在仓库中,以便别的模块调用6、mvncleaninstall-Dmaven.test.skip=true打成jar包,并且抛弃测

  • 真理的基本的属性是_thread和handler区别

    真理的基本的属性是_thread和handler区别原文地址:http://blog.csdn.net/luckeryin/article/details/5649144C#中,Thread类有一个IsBackground的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程。个人感觉这样的解释等于没有解释..Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一

    2022年10月16日
  • linux基本操作命令_vim常用命令

    linux基本操作命令_vim常用命令1.查找文件find/-name*文件名*2.开始、重启、结束进程#开始进程systemctlstartfilebeat#重启systemctlrestartfilebeat#结束systemctlstopfilebeat3.转到目录#从根目录开始搜索文件夹cd/文件名/#从当前目录开始cd文件名/4.编辑文件#编辑vim文件名vi文件名#查看cat文件名5.从编辑状态退出#先按Esc

  • 正则化的作用以及L1和L2正则化的区别

    正则化的作用以及L1和L2正则化的区别0正则化的作用正则化的主要作用是防止过拟合,对模型添加正则化项可以限制模型的复杂度,使得模型在复杂度和性能达到平衡。常用的正则化方法有L1正则化和L2正则化。L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归。但是使用正则化来防止过拟合的原理是什么?L1和L…

  • k8s配置admission-plugins

    k8s配置admission-plugins

  • 什么是igmp协议_igmpv3协议

    什么是igmp协议_igmpv3协议文章目录IGMP协议定义功能IGMPv1主机加入主机离开查询器选举成员报告抑制机制IGMPv2主机加入主机离开查询器选举成员报告抑制机制IGMPv3主机上维护的组播信息路由器维护的组播信息主机加入主机离开IGMPSnooping组播VLAN相关命令组播概述定义组播关注的问题解决方案组播地址地址范围地址分类组播模型ASMSSMIRF定义优势工作流程Master设备选举规则IRF堆叠协议热备份IRF形成的必要条件配置步骤相关命令IGMP协议定义组播组管理协议功能管理主机加入和离开组播组维护本

发表回复

您的电子邮箱地址不会被公开。

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