問題是我們經常見到的整數劃分,給出兩個整數 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表示成一系列正整...