將n劃分成最大數不超過m的劃分數

2021-08-17 17:49:10 字數 1193 閱讀 1378

之前寫過類似的文章,今天看到另外一種劃分數的方法,也就是將n劃分成不大於m的種數。

若是劃分多個整數可以存在相同的:

dp[n][m]= dp[n][m-1]+ dp[n-m][m] dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。 則劃分數可以分為兩種情況: a.劃分中每個數都小於 m,相當於每個數不大於 m- 1, 故劃分數為 dp[n][m-1]. b.劃分中有乙個數為 m. 那就在 n中減去 m ,剩下的就相當於把 n-m 進行劃分, 故劃分數為 dp[n-m][m];

若是劃分多個不同的整數: 

dp[n][m]= dp[n][m-1]+ dp[n-m][m-1] dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。 同樣劃分情況分為兩種情況: a.劃分中每個數都小於m,相當於每個數不大於 m-1,劃分數為 dp[n][m-1]. b.劃分中有乙個數為 m.在n中減去m,剩下相當對n-m進行劃分, 並且每乙個數不大於m-1,故劃分數為 dp[n-m][m-1]。

#include using namespace std;

int getnum( int n, int m )

void main()

劃分數就是將整數 n

n 分成若干個大於 0

0 的數的和。例如,n = 4n=

4,可以分成 1+1+1+11+

1+1+

1,1+1+21+

1+2,1+31+

3,2+22+

2,44,一共 5

5 種方案,注意 1+1+21+

1+2,1+2+11+

2+1,2+1+12+

1+1 被認為是相同的方案。

求整數 8080

的劃分數方案。

dfs就不貼**了,用了一種dp,dp[n][k]表示數n取分成k份,dp[n][k]=dp[n-1][k-1]+dp[n-k][k]分為有1和沒有1.

#includeusing namespace std;

int dp[100][100];

int main()

} for(int i=1;i<=n;i++) }

long long ans=0;

for(int i=1;i<=n;i++)

cout

}

363 矩形區域不超過 K 的最大數值和

給定乙個非空二維矩陣 matrix 和乙個整數 k,找到這個矩陣內部不大於 k 的最大矩形和。示例 輸入 matrix 1,0,1 0,2,3 k 2 輸出 2 解釋 矩形區域 0,1 2,3 的數值和是 2,且 2 是不超過 k 的最大數字 k 2 說明 矩陣內的矩形區域面積必須大於 0。如果行數...

長度不超過n的連續最大和

題目 在蒜廠年會上有乙個 在乙個環形的桌子上,有 nn 個紙團,每個紙團上寫乙個數字,表示你可以獲得多少蒜幣。但是這個遊戲比較坑,裡面竟然有負數,表示你要支付多少蒜幣。因為這些數字都是可見的,所以大家都是不會出現的賠的情況。遊戲規則 每人只能抓一次,只能抓取一段連續的紙團,所有紙團上的數字和就是你可...

長度不超過m的最大連續子串行(dp 單調佇列)

給你n個數,然後讓你求最大連續子串行的和,限制條件是連續子串行的長度不超過m。n,m 100000 就是讓你找到乙個長度不超過m的區間,區間和最大。普通的dp轉移方程就是 dp i sum i min sum j i m j i 但是這樣的複雜度最壞會達到n 2,所以得優化,就用到了單調佇列。針對這...