DP演算法之整數劃分

2021-07-09 22:31:00 字數 1925 閱讀 8399

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3 描述

問題是我們經常見到的整數劃分,給出兩個整數 n , m ,要求在 n 中加入m - 1 個乘號,將n分成m段,求出這m段的最大乘積

輸入

第一行是乙個整數t,表示有t組測試資料

接下來t行,每行有兩個正整數 n,m ( 1<= n < 10^19, 0 < m <= n的位數);

輸出輸出每組測試樣例結果為乙個整數佔一行

樣例輸入

2

111 2

1111 2

樣例輸出

11
思路:

先求前乙個乘號時,2位數的積、3位數的積....

再求二個乘號時,2位數的積、3位數的積....

其中最優解的結構特徵:

dp[j][i]=max(dp[j][i],dp[k][i-1]*num[k+1][j]);

dp[k][i-1]  乘號前的數字
num[k+1][j]  乘號後的數字
ac**:

#include#include#include#include using namespace std;

long long t,dp[25][25];

long long num[25][25];

char str[25];

long long max(long long a,long long b)

int main()

{ int i,j,k,m;

scanf("%lld",&t);

while(t--)

{ scanf("%s%d",str,&m);

int l=strlen(str);m--;

memset(dp,0,sizeof(dp));

memset(num,0,sizeof(num));

for(i=0;i

得到num陣列為:

dp陣列為:

其中列數代表乘號數量,如第0列代表不加乘號,其中最後結果的最大值為53241(原數)

第1列代表加入乙個乘號,其中第n行為前n位數參與運算,如第2行,有5和3參與運算加入乙個乘號為15;

第3行,有5,3,2參與運算加入乙個乘號的最大結果160。

題目中說:n<10ˇ19

但long long型別的最大資料為:9223372036854775807  存在越界風險啊...但oj並沒有報錯....應該是測試資料不完善吧...

附加各種資料取值範圍:

unsigned   int   0~4294967295   

int   2147483648~2147483647 

unsigned long 0~4294967295

long   2147483648~2147483647

long long的最大值:9223372036854775807

long long的最小值:-9223372036854775808

unsigned long long的最大值:1844674407370955161

__int64的最大值:9223372036854775807

__int64的最小值:-9223372036854775808

unsigned __int64的最大值:18446744073709551615

整數劃分(劃分dp)總結

寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...

整數劃分問題 DP

整數劃分的定義 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們記n的m劃分的個數為f n,m 舉個例子,當n 5時我們可以獲得以下這幾種劃分 注意,例子中m 5 5 5 4 1 3...

整數劃分 劃分數(DP動態規劃)

給你乙個正整數n,讓你計算出n的m劃分有幾種方法。思路 定義dp i j 為i的j劃分,即將i劃分為j個數字之和的方案數。1 當j i時,此時,劃分個數不超過i,此時是正常的劃分。劃分的結果一定只有兩種型別 一種是j個數字,都大於0。另一種是有0,即不夠劃分j個,用0來湊的。j個數字中存在0的,其實...