51Nod 1201 - 整數劃分(DP)
【題目描述】
【思路】
dp[i][j]表示數字i被劃分成j個互不相同的數字之和的方案數,那麼
dp[i][j]=dp[i−j][j]+dp[i−1][j−1]
前一項表示數字i−j被劃分成j個互不相同的數,然後每個數字+1就能得到數字i了,後一項表示數字i−j被劃分成j−1個互不相同的數,然後每個數字+1後再加上一個數字1也能得到數字i,j個互不相同的數相加至少是j(j−1)/2,是j2的級別,所以j只需要枚舉到n
的數量級就可以了
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int maxn=50005;
const int maxm=505;
int n;
int dp[maxn][maxm];
int main(){
scanf("%d",&n);
dp[0][0]=1;
for(int i=1;i<=n;++i){
for(int j=1;j<maxm;++j){
if(i>=j) dp[i][j]=((long long)dp[i-j][j]+dp[i-j][j-1])%mod;
}
}
long long ans=0;
for(int j=1;j<maxm;++j){
ans=(ans+dp[n][j])%mod;
}
printf("%lld\n",ans);
return 0;
}
相關推薦
51Nod 1201 - 整數劃分(DP)
【題目描述】 【思路】 d p [ i
51nod 1201 整數劃分 dp
bit eps 不同的 color quest stream 空間 output lac 1201 整數劃分 基準時間限制:1 秒 空間限制:131072 KB 收藏 關註 將N分為若幹個不同整數的和,有多少種不同的劃分方式,例如:
NYOJ 746 整數劃分(四)區間DP
/* 區間dp,設dp[i][j] 表示在區間[0, i]之中,插入j個乘號可以得到的最大數 設a[i][j]為區間[i,j]所形成的數 所以 dp[i][j] = max(dp[k][j-1] * a[k + 1][i]) 注意數的範圍,用int不夠 */ #include <cmath>
nyistOJ-整數劃分(四)(區間DP)
整數劃分(四) 時間限制:1000 ms | 記憶體限制:65535 KB 難度:3 描述 暑假來了,hrdv 又要留學校在參加ACM集訓了,集訓的生活非常Happy(p
NYOJ 整數劃分(四) (區間dp)
題意:給出兩個整數 n , m ,要求在 n 中加入m - 1 個乘號,將n分成m段,求出這m段的最大乘積思路:區間dp,我們需要先預處理出第i位到第j位可以湊成的數sum[i][j],之後dp[i][j]表示你在第i個數字添加了j個乘號時的最大值,那麼dp[i][j] =m
NYOJ746 整數劃分(四)(深搜DFS,區間DP)
題目; 整數劃分(四) 時間限制:1000 ms | 記憶體限制:65535 KB 難度:3 描述 暑假來了,hrdv 又要留學校在參加ACM集訓了,集訓的生活非常Happy(ps:你懂得),可是他最近遇到了一個難題,讓他百思不得其解,他非常
南陽理工oj 746 整數劃分(四) 區間dp
區間dp #include <bits/stdc++.h> using namespace std ; typedef long long ll ; char read[40] ; int re[40] ; ll val[40][40] ; ll
3641. 整數劃分(構造)
試將 1 到 n 這 n 個正整數分成三份,使得這三份的和相等。 Input 輸入一個正整數 n (1≤n≤2⋅105)。 Output 輸出 n 個正整數 k1,k2,…,kn (1≤ki≤3),用空格隔開。ki 表示要把 i 這個整數分在第幾組。 如果有多解輸出
nyoj 整數劃分(一)(二)
先來談談寫這兩道題的感受,整數劃分(一)剛開始做這道題,dp和遞迴都不會寫,是用深搜寫的,不過用深搜寫 整數劃分(二)就不行了,鐵定超時。 昨晚和今晚終於把這兩道題的遞迴和dp全看懂了(看別人部
nyoj_176_整數劃分(二)_201404261715
1 #include <stdio.h> 2 int f(int m,int n) 3 { 4 if(m==n||n==1) 5 return 1; 6 else if(m<n) 7 return 0; 8 else
整數劃分(一)
題目內容: 對於一個正整數n的劃分,就是把n變成一系列正整數之和的表示式。 注意,分劃與順序無關,例如6=5+1跟6=1+5是同一種分劃。 另外,單獨這個整數本身也算一種分劃。 例如:對於正整數n=5,可以劃分為: 1+1+1+1+1 1+1+1+2 1+1+3 1+2+2
(dp)openjudge 復雜的整數劃分問題
con fin can == names 劃分數 algorithm 系列 問題 將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。正整數n 的這種表示稱為正整數n 的劃分。
51Nod 1259 - 整數劃分 V2(五邊形數定理)
【題目描述】 【思路】 大佬的部落格 記板子 #include<bits/stdc++.h> #define f(x)(((x)*(3*(x)-1))>>1) #define g(x)(((x)*(3*(x)+1))>>1) using na
NYOJ 90 整數劃分(遞推||dp)
整數劃分 時間限制:3000 ms | 記憶體限制:65535 KB 難度:3 描述將正整數n表示成一系列正整數之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。
區間DP——整數劃分(使乘積最大)
#include <iostream> #include <cstring> #include <cmath> using namespace std; #de
51nod 1274 最長遞增路徑(DP)
string lose 自己 ring mat pri color 16px eve 一開始自己想了一種跑的巨慢。。寫了題解的做法又跑的巨快。。一臉懵逼 顯然要求邊權遞增就不可能經過重復的邊了,那麽設f[i]為第i條邊出發能走多遠就好了,這是我一開始的寫法,可能d
51nod 1296 有限制的排列(DP)
-1 images cli ring pre pri etc n) pan 對於一個i,如果要比鄰居大,那麽i比i-1大,i+1比i小,比鄰居小同理。設v[i]=0表示i與i-1的關系無限制,v[i]=1表示a[i-1]>a[i],v[i]=2表示a[i-1]&l
【51nod-1315】合法整數集(數位)
turn size nbsp include main ace amp 數位 color 【思路】 既然是or操作,將數轉化為二進制,數位是1,對應的數組元素+1,再將x轉為成二進制,只要查找X為1的位置,將之前存放的數組數字找個最小的輸出就可以了。 但是並不是所有
(DP)51NOD 1118 機器人走方格
不同的 可能 spa 結果 out include 51nod ext define M * N的方格,一個機器人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出Mod 10^9 + 7的結果。 Input 第1行,2個數M,N
51Nod 1296 - 有限制的排列(DP)
【題目描述】 【思路】 做這道題首先要知道一種全排列的生成方式:如果要生成 [ 1 ,