[51nod1201]整数划分
生活随笔
收集整理的這篇文章主要介紹了
[51nod1201]整数划分
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:
51nod1201
神仙DP
設\(f[i][j]\)表示\(i\)分成\(j\)個數的劃分數,如何轉移?
有轉移式:\(f[i][j]=f[i-j][j-1]+f[i-j][j]\)
為什么呢?第一種是先加一個劃分出來的數\(1\),但是為了和之前的所有數不一樣,之前的所有數\(+1\)。
第二種就是所有數\(+1\),沒有新劃分出來的數。
但是直接轉移是會爆空間的,我們知道需要這么多狀態嗎?
\(j\)個不同正整數拼成的最小數顯然是\(\sum_{k=1}^j k\)
那么就有\(\frac{j(j+1)}2\le i\)
那么\(j\)就是根號級別的。
時間復雜度 \(O(n\sqrt n)\)
空間復雜度 \(O(n\sqrt n)\)
代碼:
#include <cstdio>int n,f[50005][355],s; const int p=1000000007;int main() {scanf("%d",&n),f[0][0]=1;for(int i=1;i<=n;++i)for(int j=1;true;++j)if(j*(j+1)/2<=i)(f[i][j]=f[i-j][j]+f[i-j][j-1])>=p?f[i][j]-=p:0;else break;for(int i=1;i*(i+1)/2<=n;++i)(s+=f[n][i])>=p?s-=p:0;return printf("%d\n",s),0; }轉載于:https://www.cnblogs.com/LanrTabe/p/10560932.html
總結
以上是生活随笔為你收集整理的[51nod1201]整数划分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爆破linux密码 $6$3uwqC9J
- 下一篇: Gym - 101755G Under