之前寫過類似的文章,今天看到另外一種劃分數的方法,也就是將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,所以得優化,就用到了單調佇列。針對這...