poj 1953 dp(无连续1的01串个数)

题意:问长度为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]);
    }
}


你可能感兴趣的:(poj 1953 dp(无连续1的01串个数))