题目:
小明买了一些彩色的气球用绳子串在一条线上,想要装饰房间,每个气球都染上了一种颜色,每个气球的形状都
是各不相同的。我们用1到9一共9个数字表示不同的颜色,如12345则表示一串5个颜色各不相同的气球串。但小明希望
得到不出现重复颜色的气球串,那么现在小明需要将这个气球串剪成多个较短的气球串,小明一共有多少种剪法?如原
气球串12345的一种是剪法是剪成12和345两个气球串。
注意每种剪法需满足最后的子串中气球颜色各不相同(如果满足该条件,允许不剪,即保留原串)。两种剪法不同当且
仅当存在一个位置,在一种剪法里剪开了,而在另一种中没剪开。详见样例分析。
分析:动态规划,考虑前i个有多少种剪法,枚举最后剪的一段转移
代码
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 int n; 5 int book[10],a[100000],f[100000]; 6 int main() 7 { 8 int i,k,j; 9 scanf("%d",&n); 10 for(int i=0;i<n;i++) 11 scanf("%d",&a[i]); 12 f[0] = 1; 13 for(int i=1;i<=n;i++) 14 { 15 for(k=0;k<10;k++) //初始化book[k] 16 book[k] = 0; 17 for(j=i;j>=1;j--) 18 { 19 book[a[j]]++; 20 if(book[a[j]]>1) //有相同的就退出 21 break; 22 f[i] = (f[i]+f[j-1])%1000000007; 23 } 24 } 25 printf("%d \n",f[n]); 26 return 0;