總時間限制:
1000ms
記憶體限制:
65536kb
描述
給定n個1到9的數字,要求在數字之間擺放m個加號(加號兩邊必須有數字),使得所得到的加法表示式的值最小,並輸出該值。例如,在1234中擺放1個加號,最好的擺法就是12+34,和為36
輸入有不超過15組資料
每組資料兩行。第一行是整數m,表示有m個加號要放( 0<=m<=50)
第二行是若干個數字。數字總數n不超過50,且 m <= n-1
輸出對每組資料,輸出最小加法表示式的值
樣例輸入
2123456
1123456
412345
樣例輸出
10257915
提示要用到高精度計算,即用陣列來存放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...