整數劃分(四)

2021-07-11 01:11:05 字數 901 閱讀 6592

描述

問題是我們經常見到的整數劃分,給出兩個整數 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

來看思路:其實剛開始吧 我是一旦思路都沒有感覺和dp一點關係都沒有  後來看了大神的**才明白怎麼回事

我們先設dp[i][j] 為0到i中間插入j個稱號的最大值 a[i][j]表示從第i位到j位的整數值

我們可以讓乘號放在不同的位置來尋找哪個才是最大值   所以可得狀態轉移方程:

dp[i][j] = max(dp[i][j],dp[k][j] * a[k + 1][i]);  k為乘號的位置

#include#include#include#include#includeusing namespace std;

long long dp[22][22];

long long a[22][22];

char str[22];

int main(){

int l,t,m,i,j,k;

scanf("%d",&t);

while(t--){

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

l=strlen(str);

m--;

memset(a,0,sizeof(a));

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

for(i=0;i

整數劃分(四)

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

ACM 整數劃分(四)

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

nyoj746 整數劃分(四)

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