1201 整數劃分
基準時間限制:1 秒 空間限制:131072 kb 分值: 80
難度:5級演算法題
將n分為若干個不同整數的和,有多少種不同的劃分方式,例如:n = 6, ,共4種。由於資料較大,輸出mod 10^9 + 7的結果即可。
input
輸入1個數n(1 <= n <= 50000)。output
輸出劃分的數量mod 10^9 + 7。input示例
6output示例
4乙個比較好的思維了
比如 組成1的 只有 1
組成 2 的 有 2
組成3 的 有 1 2 和 3
組成 4 的 有 1 3 和 4
組成5 的 {1,4}
組成6 的 {1,5}{2,4}{1,2,3} {6}
組成7的 {1,6} {2,5}{3,4} {1,2,4}{7}
然後得出
dp[i][j]=(dp[i-j][j-1]+dp[i-j][j])%mod;
dp[i][j],表示j個數組成值為i的方法數
乙個是關於由{1,2,3} 變成{2,3,4} 這樣的
dp[i-j][j] 由和為i-j 把j個數字每個位置加1得到的
乙個是關於 例如 {1,3} 變成{1,2,4} 這個是
dp[i-j][j-1] 的 由j-1個數字 把j個位置上每個數加1得到的
#include#include#include#includeusing namespace std;
int dp[50005][370];
long long mod=1000000007;
int main()
{ memset(dp,0,sizeof(dp));
dp[1][1]=1;
dp[2][1]=1;
dp[3][1]=1;
dp[3][2]=1;
int n;
cin>>n;int x=0;
for(int i=4;i<=n;i++)
{for(int j=1;j<=350;j++)
{dp[i][j]=(dp[i-j][j-1]+dp[i-j][j])%mod;//這個很明了
// cout<
51nod 1201 整數劃分 dp
題解 顯然是一道dp,不妨設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這個數。然後就是j的範圍要知道1 2 3...
整數劃分 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 整數劃分 經典dp
題意不多說了。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...