第 191 场力扣周赛题解

最后一题醉了啊,中文的题意看完一脸懵逼,后期官方把题意改了,可是我已经跑路了啊。。。。

第 191 场力扣周赛题解_第1张图片

5424. 数组中两元素的最大乘积

思路:暴力枚举两两乘积即可。

class Solution {
    public int maxProduct(int[] nums) {
    	
    	int ans=0;
    	for(int i=0;i

5425. 切割后面积最大的蛋糕

思路:其实就是找水平两条线距离的最大值乘以竖直两条线距离的最大值。

class Solution {
    public int maxArea(int h, int w, int[] horizontalCuts, int[] verticalCuts) {
    	
    	int mod=1000000007;
    	long ans=0;
    	
    	List hh=new ArrayList<>();
    	List ww=new ArrayList<>();
    	
    	Arrays.parallelSort(horizontalCuts);
    	Arrays.parallelSort(verticalCuts);
    	
    	
    	hh.add(0); ww.add(0);
    	for(int i=0;i

5426. 重新规划路线

思路:这道题其实是可以有很多奇技淫巧的,我采用的方法是将原有向图看成无向图,将原有向边的权值设为1,反过来的边权值设为0,我们选择从0开始出发走到所有点,并标记当前点上一条边的权值是否为1就ok了。之后将所有dis求和就是答案啦,不懂的童鞋可以稍微思考一下,我这里不再过多赘述啦。

class Solution {
	
	class node{
		int v,val;
		public node(int v,int val) {
			this.v=v;
			this.val=val;
		}
	}
	
	int[] dis;
	boolean[] flag;
	List> list;
	
    public int minReorder(int n, int[][] connections) {
    	
    	dis=new int[n];
    	flag=new boolean[n];
    	list=new ArrayList<>();
    	
    	for(int i=0;i());
    	}
    	
    	for(int i=0;i

5427. 两个盒子中球的颜色数相同的概率

PS:不知道一开始的题意怎么想的,我读了几遍后得出的结论是我学了十几年的假语文?后期出题人把题意改了,可是当时我真的已经跑路了,赛后发现了新的题意后有点后悔当时应该关注下比赛的。

思路:题目不难,无非就是考了一点简单的组合数学的知识,核心考察的仍然是动态规划,我们令dp[i][j][k][u][v]表示前i种颜色的球,其中第一个盒子里有j个球,第二个盒子中有k个球,并且第一个盒子颜色数为u,第二个盒子颜色数为v的方案数。

转移方程直接看代码吧,不太能说清楚,不懂的话可以私聊我啦。

class Solution {
	
	private double[][] C;
	private double[][][][][] dp;
	
	Solution(){
		
		C=new double[25][25];
		dp=new double[9][25][25][9][9];
		
		C[0][0]=1;
		dp[0][0][0][0][0]=1;
		
		for(int i=1;i<25;i++) {
			C[i][0]=1;
			for(int j=1;j<=i;j++)
				C[i][j]=C[i-1][j-1]+C[i-1][j];
		}
		
	}
	
    public double getProbability(int[] balls) {
    	
    	int sum=0;
    	int n=balls.length;
    	
    	for(int i=0;i=t;j--)
    			for(int k=0;k<=sum;k++)
    				for(int u=i;u>=1;u--)
    					for(int v=0;v<=i;v++) {
    						dp[i][j][k][u][v]+=dp[i-1][j-t][k][u-1][v]*C[j][t];
    						dp[i][k][j][v][u]+=dp[i-1][k][j-t][v][u-1]*C[j][t];
    					}
    		for(int b=1;b=b;j--)
    				for(int k=sum;k>=t-b;k--)
    					for(int u=i;u>=1;u--)
    						for(int v=i;v>=1;v--)
    							dp[i][j][k][u][v]+=dp[i-1][j-b][k-(t-b)][u-1][v-1]
    									*C[j][b]*C[k][t-b];
    	}
    	
    	double ans=0,total=0;
    	
    	for(int i=0;i<=n;i++) {
    		ans+=dp[n][sum][sum][i][i];
    		for(int j=0;j<=n;j++)
    			total+=dp[n][sum][sum][i][j];
    	}
    	
    	return ans/total;
    }
 
}

 

你可能感兴趣的:(第 191 场力扣周赛题解)