最佳加法表示式

2021-08-14 02:55:21 字數 3255 閱讀 7500

總time limit: 

1000ms 

memory limit: 

65536kb

description

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

input

有不超過15組資料

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

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

output

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

sample input

2

123456

1123456

412345

sample output

102

57915

hint

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

source

guo wei

第乙個是debug的那些,debug 了3小時,終於找出來原因

#include

#include#include#include#include#includeusing namespace std;

const int maxn = 60;

int cnt = 0;

class biginteger

biginteger(string str_num)

~biginteger()

void setinf()

void setv(string str_num)

void display()

bool operator< (const biginteger& rhs) const

biginteger operator+ (const biginteger& rhs) const

for(int i = minor; i < v.size(); ++i)

for(int i = minor; i < rhs.v.size(); ++i)

if(carry != 0)

ret.v.push_back(carry);

return ret;

}// void operator= (const biginteger& rhs) const

};biginteger biginteger;

biginteger dp[maxn][maxn];

biginteger num_seq[maxn][maxn];

biginteger recursion(int n, int m);

void init()

int main()

// for(int i = 1; i <= str_num.length(); ++i)

// for(int j = 1; j <= str_num.length(); ++j)

// biginteger.display();

// cout << endl;

// cout << (num_seq[4][3] < num_seq[3][3]) << endl;

recursion(n, m).display();

cout << endl;

// for(int i = 0; i < 6; ++i)

// cout << endl;

// }

}return 0;

}biginteger recursion(int n, int m)

dp[n][m].setinf();

biginteger& ret = dp[n][m];

for(int i = n - 1; i >= m; --i)

}ret.visited = true;

// cout << "*-" << ++cnt << "-*";

// ret.display();

// cout << "*----*" << endl;

return ret;

}

這裡是正確的.自己寫了個簡單的高精度模版,只過載了+,<.

這是一道dp題,如果沒有高精度的話,很好寫.

狀態轉移方程在**裡.

#include#include#include#include#include#includeusing namespace std;

const int maxn = 60;

int cnt = 0;

class biginteger

biginteger(string str_num)

~biginteger()

void setinf()

void setv(string str_num)

void display()

bool operator< (const biginteger& rhs) const

biginteger operator+ (const biginteger& rhs) const

for(int i = minor; i < v.size(); ++i)

for(int i = minor; i < rhs.v.size(); ++i)

if(carry != 0)

ret.v.push_back(carry);

return ret;

}};biginteger biginteger;

biginteger dp[maxn][maxn];

biginteger num_seq[maxn][maxn];

biginteger recursion(int n, int m);

void init()

int main()

recursion(n, m).display();

cout << endl;

}return 0;

}biginteger recursion(int n, int m)

dp[n][m].setinf();

biginteger& ret = dp[n][m];

for(int i = n - 1; i >= m; --i)

ret.visited = true;

return ret;

}

最佳加法表示式

有乙個由1.9組成的數字串.問如果將m個加 號插入到這個數字串中,在各種可能形成的 表示式中,值最小的那個表示式的值是多少?思路 設定dp i j i表示為加號的個數,j表示到達陣列的第 include include include includeusing namespace std const...

最佳加法表示式

有乙個由1.9組成的數字串,問如果將m個加號插入到這個數字串中,在各種可能形成的表示式中,值最小的那個表示式的值是多少 輸入 5 3 1 2 3 4 5 輸出 24 解題思路 假定數字串長度是n,新增加號後,表示式的最後乙個加號添在第i個數字後面,那麼整個表示式的最小值,就等於在前i個數字中插入m ...

dp 最佳加法表示式

題意 有乙個由1.9組成的數字串.問如果將m個加號插入到這個數字串中,在各種可能形成的表示式中,值最小的那個表示式的值是多少。分析 假定數字串長度是n,添完加號後,表示式的最後乙個加號新增在第i 個數字後面,那麼整個表示式的最小值,就等於在前i 個數字中插入m 1個加號所能形成的最小值,加上 第i ...