蓝桥杯刷题| 排列小球 java

程序通过递归和动态规划解决给定颜色小球的排列问题,以满足颜色单调递增序列条件。
摘要由CSDN通过智能技术生成

题目描述

小蓝有黄绿蓝三种颜色的小球,分别为R,G,B个。同样颜色的小球没有区别。小蓝将这些小球从左到右排成一排,排完后,将最左边的连续同色小球个数记为t1,将接下来的连续小球个数记为t2,以此类推直到最右边的小球。

请问,总共有多少总摆放小球的方案,使得t1, t2,...为严格单调递增序列,即t1 < = t2 <=t3 <= ...。

输入描述

输入一行包含三个整数R,G,B。

其中,0 <= R,G,B <=50。。

输出描述

输出—个整数,表示答案。

输入输出样例

示例1

输入:

3 6 0

输出:

3

样例说明

用r表示红球,g表示绿球,可能的方案包括:

rrrgggggg

grrrggggg

Ggrrrgggg


import java.util.Scanner;

public class Main {
	static int[] a=new int[3];//存储各个颜色的小球数
	static int count=0;//记录符合要求的排列的数量
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner in=new Scanner(System.in);
		int sum=0;
		for(int i=0;i<3;i++) {
			a[i]=in.nextInt();
			sum+=a[i];
		}
		def(sum,0,-1);
		//sum是所剩球的总数,0是上一个颜色球的个数,-1是上一个球的颜色
		//0,1,2分别表示三种颜色;
		System.out.println(count);
	}
	private static void def(int sum, int lastnum, int lastcolor) {
		// TODO 自动生成的方法存根
		if(sum==0) {
			count++;
			return;
		}
		for(int i=0;i<3;i++) {
			if(i==lastcolor) {
				continue;
			}
			for(int j=lastnum+1;j<=a[i];j++) {
				a[i]-=j;
				def(sum-j,j,i);
				a[i]+=j;
			}
		}
		
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值