这一题其实就是斐波那契数列,但是我一开始用的是DP,不过应该思想差不多。
一数组dp[i][2],dp[i][0]代表前i个数里面最后一个数字为0的数量,dp[i][1]代表前i个数里面最后一个数字为1的数量,可知dp[i][1]+dp[i][0]就是前i个数能组成序列的数量。
这里因为不能2个1在一起,所以:
dp[i][0] = dp[i-1][0]+dp[i-1][1]
dp[i][1] = dp[i-1][0]
#include<stdio.h> #include<string.h> #define MAX 47 int dp[MAX][2]; int n; int DP(){ int i; memset(dp,0,sizeof(dp)); dp[1][0]=1;dp[1][1]=1; for(i=2;i<=n;i++){ dp[i][0] = dp[i-1][0]+dp[i-1][1]; dp[i][1] = dp[i-1][0]; } return dp[n][0]+dp[n][1]; } int main(){ int t,c=1; scanf("%d",&t); while(c<=t){ scanf("%d",&n); printf("Scenario #%d:\n",c++); printf("%d\n",DP()); printf("\n"); } }
时间: 2024-11-10 08:43:30