http://poj.org/problem?id=1953

用n个数字0或者1组成一个排列,要求每两个1不相邻,问有多少种排法

dp[n][0]记录n个连续数,结尾为0的不同排列数
dp[n][1]记录第n个连续数,结尾为1的不同排列数

DP公式:

dp[i][0]=dp[i-1][0]+dp[i-1][1];
dp[i][1]=dp[i-1][0];

#include<iostream>
using namespace std;
//dp[i][0]记录第i个连续数,结尾为0的个数
//dp[i][1]记录第i个连续数,结尾为1的个数
int dp[50][2];
int main(){
dp[
1][0]=dp[1][1]=1;
for(int i=2;i<=45;i++){
dp[i][
0]=dp[i-1][0]+dp[i-1][1];
dp[i][
1]=dp[i-1][0];
}
int n,k;cin>>n;
for(int i=1;i<=n;i++){
cin
>>k;
cout
<<"Scenario #"<<i<<":"<<endl<<dp[k][0]+dp[k][1]<<endl<<endl;
}
return 0;
}
posted on 2011-05-03 22:43  geeker  阅读(424)  评论(0编辑  收藏  举报