题解

237 条题解

  • 0
    @ 2006-09-29 14:05:46

    说实话,偶题都没读懂!!

    汗啊~~~~~~~~~~~~~

  • 0
    @ 2006-09-29 13:51:01

    我忍了,原来这题这么瓜。规律就是有那么一点不好找啊!还是看了别人的题解在搞出来,悲哀啊!!

    关键就是 a[i]:=a+a[i div 2]

    你们说常人怎么会考虑到这个???

  • 0
    @ 2006-09-28 14:55:20

    最简单的递推,也可用动态方程啊

  • 0
    @ 2006-08-29 22:02:44

    第一个数据好像是0…………

    我的正确率啊………………

  • 0
    @ 2006-08-29 22:00:34

    郁闷,luchumingq的说法我的确没看懂,不知道他在讲什么,希望有作出来的同学帮忙指点一下,谢谢

  • 0
    @ 2006-08-29 17:10:20

    无穷次后项减前项以后(同样的两项看作一项,如:2 2看作2;4 4看作4)得出一恒不变的数列:

    1 2 2 4 4 6 6 10 10 14 14 20 20 26 26 36 36 46 46 60 60 74 74 94 94 114 114 140 140 166 166 202 202 238 238......

    将上述数列再次后项减前项以后(规则相同,两项相同的看作一项):

    1 2 2 4 4 6 6 10 10 14 14 20 20 26 26 36 36 46 46...

    看到没?和上面第一个数列完全相同,这个就是规律.....

    奇怪的数列.....

  • 0
    @ 2006-08-13 13:01:42

    A[奇数]:=A[奇数-1];

    A[偶数]:=A[偶数 DIV 2]+A[偶数-1];

  • 0
    @ 2006-07-17 12:46:37

    递归在算 n>400 后会超时,用递推。

  • 0
    @ 2006-07-05 01:04:46

    深搜模拟。因为有很多数的“计数”要重复,为了提高速度,可以用一个数组来记录每个数的“计数”。当搜索到的这个数的计数已知时,则直接调用已知的计数;当搜索到的这个数的计数未知时,则利用深搜求这个数的计数,最后记录到数组中,则这个数的计数就已知了。注意每种情况都可以“不做任何处理”,所以用加0表示“不做任何处理”。因而初始值a[0]:=1;a[1]:=1;

  • 0
    @ 2006-08-29 22:15:26

    [递推]s[i]=s[i div 2]+s+1

  • 0
    @ 2006-04-26 17:03:15

    直接抽象为数学问题

    每次递归找一半就行了。

  • 0
    @ 2006-04-23 11:31:04

    转成树,一个递归来计算节点数目,另外,因为数据量比较大,所以,用一个数组来记忆搜索过的结果就好了。

    题目有点诡异,我的第一个数据没有输出,其他数据都过了,过了的人教教我。谢谢!

    fluke at sfcube.net

  • -1
    @ 2016-09-25 20:39:27

    #include<iostream>
    using namespace std;
    int h[1001];
    int main()
    {
    int n;
    cin>>n;
    h[1]=1;
    for(int i=2;i<=n;i++)
    {
    h[i]=h[i-1];
    if(i%2==0)h[i]=h[i-1]+h[i/2];
    }
    cout<<h[n];
    return 0;
    }

  • -1
    @ 2016-09-06 20:36:01
    评测结果
    编译成功
    
    测试数据 #0: Accepted, time = 0 ms, mem = 508 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 508 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 508 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 508 KiB, score = 10
    测试数据 #4: Accepted, time = 0 ms, mem = 508 KiB, score = 10
    Accepted, time = 0 ms, mem = 508 KiB, score = 50
    代码
    #include <cstdio>
    int main() {
        int dp[1001],n;
        dp[1] = 1;
        scanf("%d",&n);
        for (int i = 2;i <= n;i++) {
            dp[i] = dp[i-1];
            if (!(i%2)) dp[i] += dp[i/2];
        }
        printf("%d",dp[n]);
        return 0;
    }
    评测结果
    编译成功
    
    测试数据 #0: Accepted, time = 0 ms, mem = 504 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 512 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 508 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 508 KiB, score = 10
    测试数据 #4: Accepted, time = 0 ms, mem = 508 KiB, score = 10
    Accepted, time = 0 ms, mem = 512 KiB, score = 50
    代码
    #include <cstdio>
    int main() {
      int n,ans = 1;
      scanf("%d",&n);
      for (int i = 1;i <= n/2;i++) {
        ans++;
        for (int j = 1;j <= i/2;j++) {
          ans++;
          for (int k = 1;k <= j/2;k++) {
            ans++;
            for (int l = 1;l <= k/2;l++) {
              ans++;
              for (int i1 = 1;i1 <= l/2;i1++) {
                ans++;
                for (int j1 = 1;j1 <= i1/2;j1++) {
                  ans++;
                  for (int k1 = 1;k1 <= j1/2;k1++) {
                    ans++;
                    for (int l1 = 1;l1 <= k1/2;l1++)
                      ans++;
                  }
                }
              }
            }
          }
        }
      }
      printf("%d",ans);
      return 0;
    }
    
  • -2
    @ 2017-08-01 15:06:55

    递归

    #include<iostream>
    using namespace std;
    int ans;
    void dfs(int m)
    {
        int i;
        ans++;
        for(i=1;i<=m/2;i++)
        dfs(i);
    }
    int main()
    {
        int n;
        cin>>n;
        dfs(n);
        cout<<ans;
        return 0;
    }
    
  • -2
    @ 2017-06-25 21:46:09

    其实递归可能会好理解一些

    #include<iostream>
    using namespace std;
    
    int gb(int m)
    {  int c=1,i;
       if(m==1)
       return 1;
       for(i=1;i<=m/2;i++)
       {
          c+=gb(i);
       }
       return c;
    }
    int main()
    {
        int n;
        cin>>n;
        cout<<gb(n);
        return 0;
    }
    
  • -2
    @ 2016-08-27 10:57:21

    SB题,O(n)可过,贴一个python
    python
    f = {1 : 1}
    s = {0 : 0, 1 : 1}
    for i in range(2, 1001):
    f[i] = f[i-1] + s[i/2] - s[(i-1)/2]
    s[i] = f[i] + s[i-1]
    n = int(raw_input())
    print f[n]

信息

ID
1130
难度
2
分类
递推 点击显示
标签
递交数
7079
已通过
4174
通过率
59%
被复制
30
上传者