ACM 整數劃分(四)

2022-05-05 08:48:13 字數 1605 閱讀 1186

時間限制: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

121使用動態規劃的思想,思考了整整一下午,沒想到最後做出了5層迴圈的動態規劃。好在題目ac了,後又看網上的答案,使用的是dp區間動態規劃演算法,今天就不去研究了,有些累。下面是我的演算法

#include #include 

#include

#include

#include

using

namespace

std;

#define num 20

long

long atoll(const

char*p)

intmain()

else

}mm[i][j][k] =res;}}

}}

cout

<< mm[0][n-1][m-1] <}

return0;

}

dp區間演算法

#include #include 

#include

#include

#include

typedef

long

long

ll;typedef

long

long array[22

];array ob;

ll n,m,res,reco,rec,cur,maxs,temp;

using

namespace

std;

ll pow_dfs(ll i)

return

ress;

}ll maxmin(ll a,ll b)

void

dfs(ll pos,ll rec,ll now)

maxs=maxmin(cur,maxs);

return

; }

if(pos>=reco)

return

; dfs(pos+1

,rec,now);

ob[rec]=now/pow_dfs(reco-pos);

now=now%pow_dfs(reco-pos);

dfs(pos+1,rec+1

,now);

}int

main()

dfs(

1,0,n);

printf(

"%lld

",maxs);

if(t!=0

) printf("\n

");}

return0;

}

整數劃分(四)

描述 問題是我們經常見到的整數劃分,給出兩個整數 n m 要求在 n 中加入m 1 個乘號,將n分成m段,求出這m段的最大乘積 輸入 第一行是乙個整數t,表示有t組測試資料 接下來t行,每行有兩個正整數 n,m 1 n 10 19,0 m n的位數 輸出輸出每組測試樣例結果為乙個整數佔一行 樣例輸入...

整數劃分(四)

整數劃分 四 題意 給乙個數字n,把這個數字劃分成m段,求各段乘積的最大值。思路 區間dp。注意各個地方的下標。列舉到第i次劃分的時候,應該從j i 1開始掃瞄,因為此時是i個數字劃分成i段,如果數字個數小於i,那麼這一段最終劃分結果肯定是0,沒有必要去列舉了。include include inc...

南陽理工acm 746 整數劃分(四)(動態規劃)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 問題是我們經常見到的整數劃分,給出兩個整數 n m 要求在 n 中加入m 1 個乘號,將n分成m段,求出這m段的最大乘積 輸入 第一行是乙個整數t,表示有t組測試資料 接下來t行,每行有兩個正整數 n,m 1 n 10 19,0...