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

    题目描述

    我们要求找出具有下列性质数的个数(包含输入的自然数nn):

    先输入一个自然数(n(n<=1000)),然后对此自然数按照如下方法进行处理:

    1.不作任何处理;

    2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;

    3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.

    输入格式

    1个自然数(n(n<=1000))

    输出格式

    1个整数,表示具有该性质的数的个数。

    输入输出样例

    输入#

    6
    

    输出#

    6
    

    说明/提示

    满足条件的数为

    6,16,26,126,36,136

    题解

    记忆剪枝

    把寻找数的过程看成一个对一个树的深度搜索,在搜索过程中,把出现过的结点值记录下来,后面遇到的时候就可以从记忆里搜索,进行剪枝。

    #include<iostream>
    using namespace std;
    
    int count(int n) {
    	static int counter = 1;
    	static int memory[500] = { 0 };
    
    	if (n == 1) { //递归终止条件
    		return 1;
    	}
    
    	int k = n / 2;     //中值
    	for (int i = 1; i <= k; i++) { //遍历每个结点
    		if (memory[i] != 0) {  //若先前遇到过,寻找记忆
    			counter += memory[i];
    		}
    		else {
    			int current = counter; //记住当前全局结点数
    			counter += 1;
    			count(i);
    			memory[i] = counter - current;//记忆化
    		}
    	}
    	return counter;
    }
    
    int main() {
    	int n;
    	cin >> n;
    	cout << count(n);
    }
    
    

    其实还有非常简单的解法

    数列递推(参考某位大佬的)

    #include<iostream>
    using namespace std;
    int main() {
    	int n;
    	int f[1001] = {0};
    	cin >> n;
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= i / 2; j++) {
    			f[i] += f[j];
    		}
    		f[i]++;
    	}
    	cout << f[n] << endl;;
    	system("pause");
    }
    
  • 相关阅读:
    AngularJS中写一个包裹HTML元素的directive
    AngularJS中实现Model缓存
    控制台获取AngularJS某个元素的Scope
    体验jQuery和AngularJS的不同点以及AngularJS的迷人之处
    AngularJS中$interval的用法
    AngularJS中处理多个promise
    AngularJS中获取数据源的几种方式
    AngularJS中ui-router全攻略
    AnguarJS中链式的一种更合理写法
    AngularJS转换请求内容
  • 原文地址:https://www.cnblogs.com/urahyou/p/12367125.html
Copyright © 2011-2022 走看看