zoukankan      html  css  js  c++  java
  • LA 3904

    一道DP题;

    一共有三种砖,1*2,2*1,2*2,然后要你铺满整个n*2的地板,求不重复的铺法数;

    方法:

    首先计算了不考虑对称的情况,然后计算只考虑对称的情况;

    所以结果就是(不考虑对称数+只考虑对称数)/2;

    递推关系:

    dp[i] 表示左右各伸展 i 的对称情况。
    dp[i+1] += dp[i] 
    //两边补上 1 x 2
    dp[i+2] += dp[i]*2//两边补上 2x1 跟 2x2 兩种。

    然后只考虑对称的情况下有两种情况:

    n==奇数:

    中间有个1*2;

    n==偶数;

    中间有两个2*1;

    或者两个2*1或者一个2*2;

    代码:

     1 #include<stdio.h>
     2 #include<cstring>
     3 using namespace std;
     4 int dp1[105],dp[105];
     5 
     6 int main()
     7 {
     8     int t;
     9     int i, j, k, n;
    10     dp1[0] = 1;
    11     for(i = 0; i < 105; i++)
    12     {
    13         dp1[i+2] += dp1[i]*2;
    14         dp1[i+1] += dp1[i];
    15     }
    16     scanf("%d", &t);
    17     while(t--)
    18     {
    19         memset(dp,0,sizeof dp);
    20         scanf("%d", &n);
    21         if(n&1)
    22         {
    23             dp[1] = 1;
    24             dp[2] = 2;
    25             for(i = 1; i <= n/2; i++)
    26             {
    27                 dp[i+1] += dp[i];
    28                 dp[i+2] += dp[i]*2;
    29             }
    30             printf("%d
    ", (dp1[n]+dp[(n-1)/2])/2);
    31         }
    32         else
    33         {
    34             dp[1] = 3;
    35             dp[2] = 2;
    36             for(i = 1; i <= n/2; i++)
    37             {
    38                 dp[i+1] += dp[i];
    39                 dp[i+2] += dp[i]*2;
    40             }
    41             printf("%d
    ", (dp1[n]+dp[n/2])/2);
    42         }
    43     }
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    PHP安全编程之php.ini配置
    PHP安全编程
    PHP操作Mongodb
    PHP 提高PHP性能的编码技巧以及性能优化
    HTTP 304 详解
    PHP环境变量归纳(转自网络)
    【转载】解决Apache2+PHP上传文件大小限制的问题
    机器学习六 Xgboost: 一把屠龙刀的自我修养
    机器学习五 EM 算法
    机器学习四 SVM
  • 原文地址:https://www.cnblogs.com/yours1103/p/3361673.html
Copyright © 2011-2022 走看看