題意不多說了。
dp[i][j]表示i這個數劃分成j個數的情況數。
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]
前者表示將i - 1劃分為j個數,然後j個數都+1 還是不重複
後者表示將i - 1劃分為j - 1個數,然後j - 1個數都+1,再加上1這個數
普通的dp是n^2的,但是可以發現1 + 2 + ... + m = n , (1 + m)*m = n * 2,j只要遍歷sqrt(n * 2)個就好了。所以複雜度為n*sqrt(n*2)
1//#pragma comment(linker, "/stack:102400000, 102400000")
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include
12 #include 13
using
namespace
std;
14 typedef long
long
ll;15 typedef pair p;
16const
int n = 5e4 + 5;17
int dp[n][350], mod = 1e9 + 7;18
19int
main()
2029}30
int ans = 0;31
for(int i = 1; i <= n; ++i)
34 printf("
%d\n
", ans);35}
36return0;
37 }
整數劃分 51Nod 1201 (經典dp)
將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。input 輸入1個數n 1 n 50000 output 輸出劃分的數量mod 10 9 7。sample input 6sample output 4這道題 剛寫的時候 使...
51nod 1201 整數劃分
將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。1 n 50000 直接一看就想到是一道最簡單揹包問題 但n 50000 然後我就直接上揹包,結果毫無疑問的超時,然後我的乙個夥伴在打二維揹包暴力時手抖打錯打出了正解 我們設f...
51nod 1201 整數劃分
1201 整數劃分 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。input 輸入1個數n 1 n 50000 output 輸出劃分的數...