nyoj 746 整數劃分(四)(區間DP)

2021-08-04 11:58:56 字數 935 閱讀 1756

描述

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

思路:

dp[i][j]表示將區間[1,i]分成j段的最大值

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

**:

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

ll dp[20][20],sum[20][20];

char s[20];

ll calc(int st,int ed)//計算s[i,j]代表的數

int main()

for(int j=2; j<=m; ++j)//劃分成j部分

for(int i=j; i<=len; ++i)//區間[1,i]

for(int k=1; k//小區間

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

printf("%lld\n",dp[len][m]);

}return

0;}

nyoj746 整數劃分(四)

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

NYOJ746 整數劃分(四)

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

區間dp 整數劃分nyoj746

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