zoukankan      html  css  js  c++  java
  • 简单dp ---HDU3485 Count 101

    题目大意:让求长度为n的0 和 1 构成的串中不包含101子串的个数有多少。

    这个题当时想了好久,以为是一个规律题,一直在推规律,最后还是wa了,上网一看原来是dp问题, 不过确实递推式挺巧妙的。

    递推式dp[i] = 2 * dp[i - 1] - dp[i - 2] + dp[i - 3];

    现在就来推一下这个式子,首先dp[i]就表示当长度为 i 的 的时候满足条件(就是串中不含101)的个数,dp[i] = 2 * dp[i - 1] - {最后两位是10的个数},其中2 * dp[i-1]就表示总数,最后两位是10的个数就等于 最后一位是0的个数减去倒数第二位是0的个数, 还有一个问题就是最后一位是0怎么求, 最后一个是零的个数就是dp[i-1], 因为当前位的总个数等于前一位乘2, 因为是只有0和1两种状态,所以是0的个数就是前一位的数所以 {最后两位是10的个数} = dp[i - 2] - dp[i - 3]; 所以这个式子最后就是dp[i] = 2 * dp[i - 1] - dp[i - 2] + dp[i - 3]; 

    代码如下:

     1 #include<iostream>
     2 #include <stdio.h>
     3 using namespace std;
     4 int dp[10010];
     5 int main()
     6 {
     7     dp[0] = 0; dp[1] = 2; dp[2] = 4; dp[3] = 7;
     8     for (int i = 4; i < 10010; i++)
     9         dp[i] = (2 * dp[i - 1] -  dp[i - 2] +  dp[i - 3]) % 9997 ;
    10     int n;
    11     while (~scanf("%d", &n) && n != -1)
    12     {
    13         printf("%d
    ", dp[n]);
    14     }
    15     return 0;
    16 }
  • 相关阅读:
    APP案例分析
    第一次作业
    第0次作业
    结对编程-四则运算
    韩剧TV APP案例分析
    四则运算生成器(基于控制台)
    大学
    JAVA异常机制学习
    散列学习
    PAT 甲级1025 PAT Ranking的
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/4097304.html
Copyright © 2011-2022 走看看