小明买了一些彩色的气球用绳子串在一条线上,想要装饰房间,每个气球都染上了一种颜色,每个气球的形状都是各不相同的。我们用1到9一共9个数字表示不同的颜色,如12345则表示一串5个颜色各不相同的气球串。但小明希望得到不出现重复颜色的气球串,那么现在小明需要将这个气球串剪成多个较短的气球串,小明一共有多少种剪法?如原气球串12345的一种是剪法是剪成12和345两个气球串。

include "stdafx.h"

include

include

include

include

include<math.h>

include

include

include

include

include

using namespace std;

int main()
{
int n;
while (cin>>n)
{
vector numVec; //存储气球的个数
vector colors; //存储颜色

int num;
cin >> num;
colors.push_back(num);

numVec.push_back(1);//当有零个气球时
numVec.push_back(1);//当有一个气球时

for (int i = 1;i < n;i++)
{
int num;
cin >> num;

int cp = colors.size()-1;
int np = numVec.size()-1;
long long p = numVec[np];
// cout << "概率:" << p << endl;

for (int j = colors.size()- 1;j >= 0;j--)
{
if (colors[j] != num)
{
bool flag = true;

for (int k = j+1;k < colors.size();k++)//前面有任何一个气球和j相等则不能把气球j和后面的气球分成一组
{
if (colors[k] == colors[j])
{
flag = false;
}
}
if (flag == true)
{
p += numVec[np - cp + j - 1];
}
else
{
break;
}

}
else
{
break;
}
}

numVec.push_back(p%1000000007);//不要忘了取余数!!!!!!
// cout << "概率:" << p << endl;
colors.push_back(num);

}
cout << numVec[numVec.size() - 1] << endl;
}
return 0;
}

posted @ 2017-03-21 22:06  wdan2016  阅读(1594)  评论(1)    收藏  举报