有乙個由1..9組成的數字串,問如果將m個加號插入到這個數字串中,
在各種可能形成的表示式中,值最小的那個表示式的值是多少
輸入:5 3
1 2 3 4 5
輸出:24
解題思路:
假定數字串長度是n,新增加號後,表示式的最後乙個加號添在第i個數字後面,
那麼整個表示式的最小值,就等於在前i個數字中插入m-1個加號所能形成的最小值,
加上第i+1到第n個數字所組成的數的值(i從1開始算)
設v(m,n)表示在n個數字中插入m個加號所能形成的表示式最小值哦,
那麼:if m==0
v(m,n)==n 個數字構成的整數
else if nnum(i,j)表示從第i個數字到第j個數字所組成的數。
數字編號從1開始算。此操作複雜度是o(j-i+1),可以預處理後存起來
總時間複雜度:o(mn^2)
若n比較大,long kong不夠存放運算過程中的整數,則需要使用高精度計算
(用陣列存放大整數,模擬列豎式做加法),複雜度為o(mn^3)
/*
最佳加法表示式:
題意:有乙個由1..9組成的數字串.問如果將m個加號插入到這個數字串中,在各種可能形成的表示式中,值最小的那個表示式的值是多少。
輸入:5 3
1 2 3 4 5
輸出:24 */
/*預處理和排序都能很好的減少耗時
*/ #include#include#include#includeusing namespace std;
const int inf=0x3f3f3f3f;
const int n=1005;
int a[n],num[n][n],dp[n][n];
//a[n]裡面是存數字串
//num[i][j]表示數字串a[n]的第i位到第j位之間的數字串表示的陣列
//dp[i][j]在i個數字中插入j個加號所能形成的表示式最小值
int main()
//預處理,計算i到j數字串組成的數字
for(int i=1;i<=n;i++)
}memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;i++)
//其實就是感覺在那個位置放不放加號
//這裡n可以寫在m前面。要加乙個限制條件n>m,好麻煩,所以m在前且n=m+1
//這裡k的取值範圍就是m到n,k表示在第k個數後面插入加號
for(int i=1;i<=m;i++)
for(int j=i;j<=n;j++)
for(int k=i;k<=j;k++)
dp[i][j]=min(dp[i][j],dp[i-1][k]+num[k+1][j]);
cout<}
return 0;
}
最佳加法表示式
有乙個由1.9組成的數字串.問如果將m個加 號插入到這個數字串中,在各種可能形成的 表示式中,值最小的那個表示式的值是多少?思路 設定dp i j i表示為加號的個數,j表示到達陣列的第 include include include includeusing namespace std const...
最佳加法表示式
總time limit 1000ms memory limit 65536kb description 給定n個1到9的數字,要求在數字之間擺放m個加號 加號兩邊必須有數字 使得所得到的加法表示式的值最小,並輸出該值。例如,在1234中擺放1個加號,最好的擺法就是12 34,和為36 input 有...
dp 最佳加法表示式
題意 有乙個由1.9組成的數字串.問如果將m個加號插入到這個數字串中,在各種可能形成的表示式中,值最小的那個表示式的值是多少。分析 假定數字串長度是n,添完加號後,表示式的最後乙個加號新增在第i 個數字後面,那麼整個表示式的最小值,就等於在前i 個數字中插入m 1個加號所能形成的最小值,加上 第i ...