小明買了一些彩色的氣球用繩子串在一條線上,想要裝飾房間,每個氣球都染上了一種顏色,每個氣球的形狀都是各不相同的。我們用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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM