NYOJ746 整數劃分(四)

2022-08-22 01:21:11 字數 1044 閱讀 6816

題目描述

問題是我們經常見到的整數劃分,給出兩個整數 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 個乘號的最大乘積。從 j 到 i 列舉乙個 k ,那麼轉移方程就是:

dp[ i ][ j ]=max( dp[ i ][ j ] , dp[ k ][ j-1 ] * num[ k+1 ][ i ] )            ,其中num[ i ][ j ] 表示s[ i ] 到 s[ j ] 這段區間表示的數值。

初始化:f[ i ][ 0 ] = num[ 1 ][ i ] 

記得開 long long 啊。

#include#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

const

int maxn=30

;ll m,t,n,num[maxn][maxn],dp[maxn][maxn];

char

a[maxn];

intmain()

for(int i=1;i<=n;i++)

dp[i][

0]=num[1

][i];

for(int j=1;j)

for(int i=j+1;i<=n;i++)

cout

<1]<}

return0;

}

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...

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

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