時間限制:
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的,其實...