题目链接:https://vjudge.net/problem/UVA-580
设答案为f(n),以3个U为分类依据,让i,i+1,i+2成为3个U,这样i前面的可以不需要3个U,但是有一个问题,如果前i-1为U,那么i-1,i,i+1还是可以组成3个U,这样就不符合从第i个开始为至少3个U了,所以我们要剔除掉这种情况,可以强制让i-1为L,这样把i-1前面的可排列数量和i+2后面的可排列数量相乘就可以得到正确答案,接下来看边界,f[0],[1],[2]=0,因为不满足至少3个U的定义。
此外,n个盒子“没有3个U放在一起的”方案数为g(n)=2^n-f(n),可以写出关系式f(n)=2^(n-3)+ * g(i-1)*2^(n-i-2).
f(n)里的2^(n-3)为当U在第一个位置时,不要遗漏这种情况,因为后面的表达式是从2开始的。
#include<bits/stdc++.h>
using namespace std;
int f[31];
int main(){
int n;
f[0]=f[1]=f[2]=0;
for(int i=3;i<31;i++){
f[i]=pow(2,i-3);
for(int j=2;j<i-1;j++){
f[i]+=pow(2,i-j-2)*(pow(2,j-2)-f[j-2]);
}
}
while(scanf("%d",&n) && n){
printf("%d\n",f[n]);
}
}