zoukankan      html  css  js  c++  java
  • HDU 5366 The mook jong (简单DP)

    题意:ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里。由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间地砖必须大于等于两个,现在ZJiaQ想知道在至少摆放一个木人桩的情况下,有多少种摆法。

    思路:题意类似于“要求找到所有满足这样要求的二进制的数:(1)不能出现101   (2)不能出现11  (3)不能为0”。

      问题是可以降低规模的,也就是也可以递推,假设cnt[i][0]表示第i位放0的所有可能数,cnt[i][1]表示第i位放1的所有可能数,递推式如下:

      (1)cnt[i][0]=cnt[i-1][0]+cnt[i-1][1];
      (2)cnt[i][1]=cnt[i-2][0]+1;

      而答案就是cnt[n][0]+cnt[n][1]。

     1 //#include <bits/stdc++.h>
     2 #include <cstdio>
     3 #include <vector>
     4 #include <deque>
     5 #include <cmath>
     6 #include <cstring>
     7 #include <iostream>
     8 #include <algorithm>
     9 #define INF 0x7f7f7f7f
    10 #define pii pair<int,int>
    11 #define LL long long
    12 using namespace std;
    13 const int N=65;
    14 LL cnt[N][3];
    15 LL ans[N];
    16 
    17 void pre_cal()
    18 {
    19     memset(cnt, 0, sizeof(cnt));
    20     cnt[1][0]=0;
    21     cnt[1][1]=1;
    22 
    23     cnt[2][0]=1;
    24     cnt[2][1]=1;
    25 
    26     ans[1]=1;
    27     ans[2]=2;
    28 
    29     for(int i=3; i<N; i++)
    30     {
    31         cnt[i][0]=cnt[i-1][0]+cnt[i-1][1];
    32         cnt[i][1]=cnt[i-2][0]+1;
    33         ans[i]=cnt[i][0]+cnt[i][1];
    34     }
    35 }
    36 
    37 int main()
    38 {
    39     freopen("input.txt", "r", stdin);
    40     pre_cal();
    41     int n;
    42     while(cin>>n)
    43     {
    44         cout<<ans[n]<<endl;
    45     }
    46     return 0;
    47 }
    AC代码

    另一种方法是,穷举一下所有可能,打出60个答案,直接用数组保存,速度杠杠的。

  • 相关阅读:
    动态载入DLL
    在DELPHI中使用自定义光标
    Delphi实现提取可执行文件内部所有图标
    delphi 网络函数
    delphi制作dll
    实现半透明效果
    自绘按钮,添加Color属性(转载)
    为汉语名字生成首字母助记码
    DELPHI 获取本月 的第一天 和 最后一天
    GRID用法(取行、列值;定位选中某行等等)
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4714628.html
Copyright © 2011-2022 走看看