動態規劃 最佳加法表示式

2021-08-07 19:43:34 字數 1867 閱讀 4191

總時間限制: 

1000ms

記憶體限制: 

65536kb

描述

給定n個1到9的數字,要求在數字之間擺放m個加號(加號兩邊必須有數字),使得所得到的加法表示式的值最小,並輸出該值。例如,在1234中擺放1個加號,最好的擺法就是12+34,和為36

輸入有不超過15組資料

每組資料兩行。第一行是整數m,表示有m個加號要放( 0<=m<=50)

第二行是若干個數字。數字總數n不超過50,且 m <= n-1

輸出對每組資料,輸出最小加法表示式的值

樣例輸入

2

123456

1123456

412345

樣例輸出

102

57915

提示要用到高精度計算,即用陣列來存放long long 都裝不下的大整數,並用模擬列豎式的辦法進行大整數的加法。

解題思路

1.找子問題:

在n個數字中插入m個加號所能形成的表示式的最小值

2.確定狀態:

設v(m,n)表示

在n個數字中插入m個加號所能形成的表示式的最小值。

3.確定初始狀態值:

v (0,n) = n個數字構成的整數

4.找出狀態轉移方程:

v(m,n)=min (i=m...n-1)

num(i,j)表示從第i個數字到第j個數字所組成的數。可以預處理後存起來。

我的**(非高精度計算)

#include

#include

using namespace std;

int cnt,len;

char a[52];

int num[52][52] = ;

int getnum(int s, int e)

int minvalue(int m, int n)

return tmp; }

}int main()

return 0; }

加上高精度計算的不會寫,以下為老師**(執行起來好像不對):

#include

#include

#include

using namespace std;

struct bigint

else

carry = 0; }

if ( carry == 1)

else

result.len = ml;

return result; }

bool operator<(const bigint & n)

return false; }

}bigint()

bigint(const char * n,int l) };

ostream & operator <<(ostream & o,const bigint & n)

const int maxn = 60;

char a[maxn];

bigint num[maxn][maxn];//num[i][j]表示從第 i 個數字到第 j 個數字所構成的整數

bigint v[maxn][maxn]; //v[i][j]表示 i 個加號放到前 j 個數字中間,所能得到的最佳表示式的值。

int main()

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

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

v[i][j] = tmpmin; }

} }cout << v[m][n] << endl; }

return 0; }

最佳加法表示式(動態規劃)

一 題目描述 描述 給定n個1到9的數字,要求在數字之間擺放m個加號 加號兩邊必須有數字 使得所得到的加法表示式的值最小,並輸出該值。例如,在1234中擺放1個加號,最好的擺法就是12 34,和為36 輸入 有不超過15組資料 每組資料兩行。第一行是整數m,表示有m個加號要放 0 m 50 第二行是...

動態規劃之最佳加法表示式

有乙個由1.9組成的數字串.問如果將m個加號插入到這個數字串中,各種可能形成的表示式中,值最小的那個表示式的值是多少?假設數字串的長度為n,有m個括號,插入的所有可能性為n m 如果要把所有可能性全部計算出來再找出最小值,這樣計算的時間複雜符是巨大的。換乙個角度思考,從後往前來看 若最後乙個加號新增...

Python 動態規劃 最佳加法表示式

輸入乙個數字組成的字串,給m個加號,將所有加號任意放在字串中中某位置,要求最終得到的加法表示式的結果最小。輸入 2 123456 輸出 135 我們用加號的個數作為迭代的依據。建立兩個二維陣列。第乙個是cur min m n 表示將m個 號放入前n個數字中。根據加法式子的構成我們可以得到兩個條件。1...