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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android软件开发工具(WiFi破解)

    做为一个多年奋战在Android应用开发一线的程序员来说,程序调试的苦是不言而喻的,在过去的很长一段时间里,我们如果要调试Android应用只能通过USB数据线,一头连着手机,一头联着电脑,不敢让手机离开电脑半步。、         曾经有一段时间,我总是担心天天这样高强度的调试别把手机的USB口给磨坏了。也许有朋友问了,那怎么不用模拟器呢?事实上,不是不想用,而是电脑上开个模似器可能需

    2022年4月13日
    61
  • SCTP协议详解

    SCTP(StreamControlTransmissionProtocol)是一种传输协议,在TCP/IP协议栈中所处的位置和TCP、UDP类似,兼有TCP/UDP两者特征。SCTP是可以确保数据传输的,和TCP类似,也是通过确认机制来实现的。和TCP不同的是:1. TCP是以字节为单位传输的,SCTP是以数据块为单位传输的TCP接收端确认的是收到的字节数,SCTP接收端确认的是接收到的…

    2022年4月4日
    51
  • linux的vi命令详解_centos7 vi命令

    linux的vi命令详解_centos7 vi命令Linux命令-vi命令  vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器.。1.语法:vi[参数][文件名称]…2.功能:  编辑文件。3.参数:n打印最近的n条历史命令。-N显示历史记录中最近的N个记录。-c清空当前历史命令。-a将目前新增的历史

    2022年9月22日
    4
  • Centos下添加用户到用户组

    Centos下添加用户到用户组

    2021年10月23日
    99
  • MODBUS协议详解

    MODBUS协议详解MODBUS 协议详解一 了解 MODBUSMODBUS 是 OSI 模型第 7 层上的应用层报文传输协议 它在连接至不同类型总线或网络的设备之间提供客户机 服务器通信 它主要用于工业自动化设备通信 MODBUS 可以在基于串行链路和以太 TCP IP 网络的 MODBUS 上可以进行通信 也就是说 可以使用串口线或者网线链接两端设备 双方约定使用 modbus 协议去通信 二 了解 MODBUS 协议前面我们说了 MODBUS 有两种实现方式 一个是串口 一个是网口 后面称呼为 TCP 那么 MODBUS 协议对应

    2025年12月10日
    7
  • MFC文件操作

    文件操作:二进制文件和文本文件的区别。二进制文件将数据在内存中存在的模式原封不动的搬到文件中,而文本文件是将数据的asc码搬到文件中。首先做一个读写文件的菜单,在CxxView里响应1.C的方式:fw

    2021年12月26日
    49

发表回复

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

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