南陽理工oj 整數劃分(DP)

2021-08-01 00:08:51 字數 1089 閱讀 4090

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

給出乙個數,用乘號分成m塊,求出分完之後值最大。

思路:dp[i][j] 表示從1到i的數中分成j塊。

需要做乙個預處理,求出a[i][j],表示i到j的數是多少。解決的方法就是從2到m進行自低向上的dp。

那麼狀態轉移方程就是:dp[i][j] = max(dp[i][j],dp[k][j-1]*a[k+1][i])(k表示第j個括號可能插入的位置)。

#include 

#include

#include

using

namespace

std;

const

int maxn = 100;

long

long a[maxn][maxn],m;

long

long dp[maxn][maxn];

int main()

}if(flag == 0 && len-1 == m || len -1

< m)

long

long x ,ans ;

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

for(int i = 0;i < len; i++)

ans = 0;

if(m == 1)

ans = dp[len-1][1];

for(int j = 2;j <= m; j++) }}

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

}return

0;}

南陽理工746整數劃分 區間dp

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

南陽oj 題目 90 整數劃分

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 將正整數n表示成一系列正整數之和 n n1 n2 nk,其中n1 n2 nk 1,k 1。正整數n的這種表示稱為正整數n的劃分。求正整數n的不 同劃分個數。例如正整數6有如下11種不同的劃分 6 5 1 4 2,4 1 1 3 ...

哈理工OJ 2004 整數劃分(經典dp問題)

整數劃分 time limit 1000 ms memory limit 32768 k total submit 143 109 users total accepted 115 104 users rating special judge no description 將正整數n表示成一系列正整...