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

include "stdafx.h"

#include<iostream>  
#include<vector>  
#include<string>
#include<algorithm>
#include<math.h>
#include<iomanip>
#include<numeric>
#include<list>
#include<deque>
#include<queue>

using namespace std;


int main()
{
	int n;
	while (cin>>n)
	{
		vector <int> numVec; //存储气球的个数
		vector <int> 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  阅读(1538)  评论(1编辑  收藏  举报