蓝桥杯 ADV-153 数的划分

 算法提高 数的划分  

时间限制:1.0s   内存限制:256.0MB

    

问题描述

  一个正整数可以划分为多个正整数的和,比如n=3时:
  3;1+2;1+1+1;
  共有三种划分方法。
  给出一个正整数,问有多少种划分方法。

输入格式

  一个正整数n

输出格式

  一个正整数,表示划分方案数

样例输入

3

样例输出

3

数据规模和约定

  n<=100

分析:将数n分别分为1~n段并对每段递归操作,若段数为1则为一种分法。若单纯递归会超时。这里采用记忆化搜索来减小时间复杂度。

代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int dp[101][101][101] = { 0 };
int f(int i, int n, int k) {
	if (dp[i][n][k] != -1) {
		return dp[i][n][k];
	}
	if (k == 1) {
		return 1;
	}
	int ans = 0;
	for (int j = i; j <= n / k; j++) {
		ans += f(j, n - j, k - 1);
	}
	dp[i][n][k] = ans;
	return ans;
}
int main() {
	int ans = 0;
	fill(dp[0][0], dp[0][0] + 101 * 101 * 101, -1);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		ans += f(1, n, i);
	}
	cout << ans << endl;
	return 0;
}

 

点赞