zoukankan      html  css  js  c++  java
  • 数的计数

    D14440. 【NOIP2001P】数的计数

    > 时间限制:1.0s 内存限制:256.0MB
    输入文件名:count.in 输出文件名:count.ans
    试题来源:NOIP
    问题描述
      我们要求找出具有下列性质数的个数(包含输入的自然数n):
      先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
      1.不作任何处理;
      2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
      3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
    输入格式
      一个自然数n(n<=1000)
    输出格式
      一个整数,符合条件的数的个数
    样例输入
    6
    样例输出
    6
    提示
      满足条件的数为 6 (此部分不必输出)

      16
      26
      126
      36
    136

    思路:
    定义f(n) 为n的拆分结果
    因为2n和2n+1 都/2后是相同的,所以F(2N+1) = F(2N)。
    而一个偶数F(2n) =F(N) +F(N-1)+F(N-2)+F(N-3)+...F(1), 化简刚好是F(2N)=F(N)+F(2N-1)。
    边界条件当n=1时自然无法拆分F(1)=1
    所以有
    f(N)=f(n/2)+f(n-1) (n%2=0)
    f(n-1) (n%2=1)
    1 (n=1)

    Code:
    递归:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int n;
    int dp[1010];
    
    int count(int x){
    	if(x==1) return 1;
    	if(x%2) return count(x-1);
    	if (dp[x]) return dp[x];
    	else dp[x] = return count(x/2) + count(x-1);
    }
    
    int main(){
    	freopen("count.in","r",stdin);
    	freopen("count.ans","w",stdout);
    	cin >> n;
    	int ans = count(n);
    	cout << ans << endl;
    	return 0;
    }
    

    当然还可以递推:
    Code:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int ans[1010];
    int n;
    
    int main(){
    	freopen("count.in","r",stdin);
    	freopen("count.ans","w",stdout);
    	cin >> n;
    	ans[0] = ans[1] = 1;
    	for(int i = 2; i <= n; i++)
    		if(i % 2) ans[i] = ans[i-1];
    		else ans[i] = ans[i-1] + ans[i/2];//分奇偶性讨论
    	cout << ans[n] << endl;
    	return 0;
    }
    
  • 相关阅读:
    20162330 2016-2017-2《程序设计与数据结构》课程总结
    强化学习--Policy Gradient
    59. Spiral Matrix II
    54. Spiral Matrix(剑指offer 19)
    58. Length of Last Word
    c++ string split
    神经网络反向传播,通俗理解
    大话设计模式C++ 备忘录模式
    57. Insert Interval
    c++ sort
  • 原文地址:https://www.cnblogs.com/sun915/p/9512584.html
Copyright © 2011-2022 走看看