# Dynamic Programming# Integer Partition# Array

e932 - pB. 數字拆解

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算給定正整數 n 的整數分割方案數。整數分割是指將一個正整數分解成若干個正整數的和,其中順序不考慮。例如,對於 n=4,可能的分割方案有:4, 3+1, 2+2, 2+1+1, 1+1+1+1,總共有 5 種方案。

解題思路

此題可以使用動態規劃解決。由於 n 的範圍較小 (1 ≤ n ≤ 100),可以直接使用一個陣列 ans 儲存從 1 到 100 的每個數字的整數分割方案數。程式碼中預先計算了 ans 陣列的值,然後直接輸出 ans[n]。預計算的過程實際上是動態規劃的應用,但程式碼中直接使用了預計算好的結果,避免了在執行時進行計算。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(1)

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
inline int read(){
	int a(0);
	char c('0');
	while(c>='0'){
		a=(a<<3)+(a<<1)+c-'0';
		c=getchar_unlocked();
	}
	return a;
}
inline void write(int x) {
	int stk[9],*ptr(&stk[0]);
	while(x){*ptr=x%10;x/=10;++ptr;}
	while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
}
int ans[101]={1,1,2,3,5,7,11,15,22,30,42,56,77,101,135,176,231,297,385,490,627,792,1002,1255,1575,1958,2436,3010,3718,4565,5604,6842,8349,10143,12310,14883,17977,21637,26015,31185,37338,44583,53174,63261,75175,89134,105558,124754,147273,173525,204226,239943,281589,329931,386155,451276,526823,614154,715220,831820,966467,1121505,1300156,1505499,1741630,2012558,2323520,2679689,3087735,3554345,4087968,4697205,5392783,6185689,7089500,8118264,9289091,10619863,12132164,13848650,15796476,18004327,20506255,23338469,26543660,30167357,34262962,38887673,44108109,49995925,56634173,64112359,72533807,82010177,92669720,104651419,118114304,133230930,150198136,169229875,190569292},n;
int main(){
	n=read();
	write(ans[n]);
}

Discussion