算法 BigInteger、DP、DFS

第一题(文件命名T1)
一副扑克除去大王小王有52张牌,那么一副完全打乱的牌有多少种排列的可能?
456789取mod。
Ps:无视花色,♣♦♥♠四种花色算是同一种牌

package 日常练习;

import java.math.BigInteger;

public class 扑克排序 {
	public static void main(String[] args) {
		BigInteger mod=new BigInteger("123456789");
		BigInteger a=new BigInteger("1");
		BigInteger p=new BigInteger("1");
		BigInteger ans=new BigInteger("1");
		for(int i=2;i<52;i++)
		{
			p=p.add(a);
			ans=ans.multiply(p);
		}
		BigInteger fm=new BigInteger("24");
		System.out.println(ans);
		System.out.println((ans.divide(fm.pow(13))).mod(mod));
	}
}

第二题(文件命名T2)
使用1~9,九个数字,组成三行三列的方阵,使每行每列以及对角线的数值相等。
请输出所有组成方案。
最终结果对123Ps:全排列问题

package 日常练习;

import java.util.Arrays;

public class 九宫求值 {
	public static int arr[]= {1,2,3,4,5,6,7,8,9};
	public static void f(int p) {
		if(p==arr.length) {
			check();
		}
		for(int i=p;i<arr.length;i++)
		{
			int t=arr[i];arr[i]=arr[p];arr[p]=t;
			f(p+1);
			t=arr[i];arr[i]=arr[p];arr[p]=t;
		}
	}
	public static void check() {
		if(arr[0]+arr[1]+arr[2]==arr[3]+arr[4]+arr[5]
		&&arr[0]+arr[1]+arr[2]==arr[6]+arr[7]+arr[8]
		&&arr[0]+arr[3]+arr[6]==arr[1]+arr[4]+arr[7]
		&&arr[0]+arr[3]+arr[6]==arr[2]+arr[5]+arr[8]
		&&arr[0]+arr[4]+arr[8]==arr[2]+arr[4]+arr[6]) {
			for(int i=0;i<arr.length;i++) {
				System.out.print(arr[i]+"  ");
				if((i+1)%3==0)
					System.out.println();
			}
			System.out.println("**************************");
		}

	}
	public static void main(String[] args) {
		f(0);
	}
}

第三题(文件命名T3)
从数组{5,6,7,8,9,10,11,12,13,14}中选出三个数据,使其组成A,B,C(B>A>C)请问有多少种组合方式。
Ps:组合问题

package 日常练习;

public class 组合数 {
	public static void main(String[] args) {
//		int arr[]= {5,6,7,8,9,10,11,12,13,14};
		int arr[]= {5,6,7,8};
		int count=0;
		for(int i=0;i<arr.length;i++)
		{
			for(int j=i+1;j<arr.length;j++)
				
			{
				for(int k=j+1;k<arr.length;k++)
				{
					count++;
				}
			}
		}
		System.out.println(count);
	}
}

第四题(文件命名T4)
92
34 65
43 65 77
12 43 76 23
87 12 19 99 25
25 57 92 46 83 29
77 39 16 43 67 65 43
从上边顶点出发,选择它下面的左右节点 (每层只选一个,且后项必须为前一项的子节点),求该堆所能组成的最大值。
例如:
82
24 77
88 17 21
最大值为82+24+88

package 日常练习;

public class 堆求最大值 {
	public static int ans=0;
	public static int arr[][]= {
			{92},
			{34 , 65},
			{43 , 65  ,77},
			{12 , 43 , 76 , 23},
			{87 , 12 , 19 , 99 , 25},
			{25 , 57 , 92 , 46 , 83 , 29},
			{77 , 39 , 16 , 43 , 67  ,65 , 43}
	};
	public static void f(int p,int q,int current) {
		if(p==arr.length) {
			ans=ans>current?ans:current;
		}else {
			f(p+1,q,current+arr[p][q]);
			f(p+1,q+1,current+arr[p][q]);
		}
	}
	public static void main(String[] args) {
		
	//DP解法
	//#############################################################################
//		for(int i=arr.length-1;i>0;i--)
//		{
//			for(int j=0;j<=arr[i].length-2;j++)
//			{
//				arr[i-1][j]+=arr[i][j]>arr[i][j+1]?arr[i][j]:arr[i][j+1];
//			}
//		}
//		System.out.println(arr[0][0]);
	//DFS解法
	//##################################################################################
		f(0,0,0);
		System.out.println(ans);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值