最佳加法表示式

2021-09-25 11:55:15 字數 1441 閱讀 4322

有乙個由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 ...