问题描述
小蓝有黄绿蓝三种颜色的小球,分别为 R, G, B 个。同样颜色的小球没有区别。
小蓝将这些小球从左到右排成一排,排完后,将最左边的连续同色小球个数记为 t_1,将接下来的连续小球个数记为 t_2,以此类推直到最右边的小球。
请问,总共有多少总摆放小球的方案,使得 t_1, t_2, … 为严格单调递增序列,即 t_1 < t_2 < t_3 < …
输入格式
输入一行包含三个整数 R, G, B。
输出格式
输出一个整数,表示答案。
样例输入
3 6 0
样例输出
3
样例说明
用 r 表示红球,g 表示绿球,可能的方案包括:
rrrgggggg
grrrggggg
ggrrrgggg
样例输入
2 4 6
样例输出
3
样例说明
用 r 表示红球,g 表示绿球,b 表示蓝球,可能的方案包括:
rrggggbbbbbb
grrgggbbbbbb
brrggggbbbbb
数据规模和约定
对于30%的评测用例,1 <= R, G, B <= 10;
对于60%的评测用例,1 <= R, G, B <= 30;
对于所有评测用例,1 <= R, G, B <= 50。
#include <bits/stdc++.h>
using namespace std;
char a[151];
int s[100];
int ans;
bool check(){//检查是否单调递增
int cnt = 1;
int t = 0;
for(int i=0;a[i];i++){
if(a[i]==a[i+1]){
cnt++;
}else{
s[t++] = cnt;
cnt = 1;
}
}
for(int i=1;i<t;i++){
if(s[i]<=s[i-1]){
return false;
}
}
return true;
}
void dfs(int step,int r,int g,int b){
int lx_len;
int j;
if(r==0&&g==0&&b==0){//小球数量全部用完
if(check()){
for(int i=0;i<3;i++)cout<<s[i]<<' ';
cout<<endl;
for(int i=0;i<step;i++)
cout<<a[i];
cout<<endl;
ans++;
}
return;
}
if(r!=0){
a[step]='r';
dfs(step+1,r-1,g,b);
}
if(g!=0){
a[step]='g';
dfs(step+1,r,g-1,b);
}
if(b!=0){
a[step]='b';
dfs(step+1,r,g,b-1);
}
}
int main(){
int r,g,b;
scanf("%d%d%d",&r,&g,&b);
dfs(0,r,g,b);
printf("%d",ans);
return 0;
}