總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
2123456
1123456
412345
sample output
10257915
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 ...