题意:问长度为n的无连续1出现的01串有多少个?
思路:简单dp。
思路1:dp[i][0]表示以0结尾长度为i的串的个数;dp[i][1]表示以1结尾长度为i的串的个数。则转移方程为dp[i][0] = dp[i-1][0]+dp[i-1][1]和dp[i][1] = dp[i-1][0]。最终对于长度为n的串输出dp[n][0]+dp[n][1]即可。
思路2:注意对于长度为i的序列,其值为在长度为i-1的序列末尾添加0,以及在长度为i-1且第i-1位为0的序列末尾添加1。而后者恰为长度为i-2的序列个数。也即dp[i] = dp[i-1]+dp[i-2],这就是斐波那契数列。
#include <stdio.h> #include <string.h> long long dp[47][2]; int c,T; void computedp(){ int i; dp[1][0] = dp[1][1] = 1; for(i = 2;i<=45;i++){ dp[i][0] = dp[i-1][0]+dp[i-1][1]; dp[i][1] = dp[i-1][0]; } } int main(){ computedp(); scanf("%d",&T); for(c = 1;c<=T;c++){ int n; scanf("%d",&n); printf("Scenario #%d:\n",c); printf("%lld\n\n",dp[n][0]+dp[n][1]); } }或者:
#include <stdio.h> #include <string.h> long long dp[47]; int c,T,n; void computedp(){ int i; dp[1] = 2; dp[2] = 3; for(i = 3;i<=45;i++) dp[i] = dp[i-1]+dp[i-2]; } int main(){ computedp(); scanf("%d",&T); for(c = 1;c<=T;c++){ scanf("%d",&n); printf("Scenario #%d:\n",c); printf("%lld\n\n",dp[n]); } }