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


相关推荐

  • SAE J1939物理层

    SAE J1939物理层在SAEJ1939-11和ISO11898中对商用车使用的线束都是屏蔽双绞线,即为除了电源、地、CAN_H、CAN_L之外还有一个屏蔽线,并且所有ECU的屏蔽线都接到同一个地线上,一般接地点选择在网络的中央位置上。但是在实际使用中,多数整车厂使用的都是非屏蔽双绞线,比较而言,非屏蔽双绞线的EMC特性要差一些,在1939中正常使用屏蔽双绞线一路CAN网络上最多可以接入30个ECU,而对于非屏蔽双

    2022年5月22日
    30
  • linux远程开机wol,Wol在线远程开机、唤醒工具使用说明「建议收藏」

    linux远程开机wol,Wol在线远程开机、唤醒工具使用说明「建议收藏」判断主机是否支持远程开机?关机模式下,BIOS的电源管理菜单下有RemoteWakeUp或WakeonLAN选项的电脑才支持远程开机,若无此选项则不支持远程开机(假如RemoteWakeUp开启后不支持远程开机,请咨询硬件提供商。)如何进入bios:当电脑启动时,通过反复按“DELETE”键或“F2”键,进入BIOS设置。通常都是到“PowerManagment”下寻找,”Wake…

    2022年5月5日
    280
  • S3C2440移植uboot之支持NAND启动

    S3C2440移植uboot之支持NAND启动上一节S3C2440移植uboot之新建单板_时钟_SDRAM_串口移植uboot初始化了时钟,配置了支持串口,这一节我们继续修改uboot支持NAND启动。

    2022年6月13日
    36
  • OpenStack开发_软件架构与应用开发实践报告

    OpenStack开发_软件架构与应用开发实践报告一起研究系列:OpenStack架构分析与实践

    2022年4月21日
    46
  • rider激活码-激活码分享

    (rider激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlKU…

    2022年3月22日
    571
  • route 命令详解

    route 命令详解转自“ITPUB博客”,链接:http://blog.itpub.net/86584/viewspace-755197/因为工作中需要了解网络配置,在众多文中,找到一详解,特此分享。1.使用背景需要接入两个网络,一个是部署环境所在内网环境,这个环境是上不了外网,外网环境很可能是一个无线网络。如果两者都连接上,很可能导致有一方不能起作用,即外网或内网上不了,常常需要…

    2022年7月18日
    13

发表回复

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

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