最大算式
問題描述
題目很簡單,給出N個數字,不改變它們的相對位置,在中間加入K個乘號和N-K-1個加號,(括號隨便加)使最終結果盡量大。因為乘號和加號一共就是N-1個了,所以恰好每兩個相鄰數字之間都有一個符號。例如:
N=5,K=2,5個數字分別為1、2、3、4、5,可以加成:
1*2*(3+4+5)=24
1*(2+3)*(4+5)=45
(1*2+3)*(4+5)=45
…… 輸入格式 輸入文件共有二行,第一行為兩個有空格隔開的整數,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行為 N個用空格隔開的數字(每個數字在0到9之間)。 輸出格式 輸出文件僅一行包含一個整數,表示要求的最大的結果 樣例輸入 5 2
1 2 3 4 5 樣例輸出 120#include<iostream> #include<cstring> using namespace std;int f[100][100]; int a[120],sum[120];int main() {int n,k;sum[0]=0;cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];sum[i]=sum[i-1]+a[i];}memset(f,0,sizeof(f));for(int i=1;i<=n;i++)f[i][0]=sum[i];for(int i=2;i<=n;i++){int t=min(i-1,k);for(int j=1;j<=k;j++){for(int k=2;k<=i;k++){int s=sum[i]-sum[k-1];f[i][j]=max(f[k-1][j-1]*s,f[i][j]);}}}cout<<f[n][k]<<endl;}
樣例說明 (1+2+3)*4*5=120
N=5,K=2,5個數字分別為1、2、3、4、5,可以加成:
1*2*(3+4+5)=24
1*(2+3)*(4+5)=45
(1*2+3)*(4+5)=45
…… 輸入格式 輸入文件共有二行,第一行為兩個有空格隔開的整數,表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行為 N個用空格隔開的數字(每個數字在0到9之間)。 輸出格式 輸出文件僅一行包含一個整數,表示要求的最大的結果 樣例輸入 5 2
1 2 3 4 5 樣例輸出 120#include<iostream> #include<cstring> using namespace std;int f[100][100]; int a[120],sum[120];int main() {int n,k;sum[0]=0;cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];sum[i]=sum[i-1]+a[i];}memset(f,0,sizeof(f));for(int i=1;i<=n;i++)f[i][0]=sum[i];for(int i=2;i<=n;i++){int t=min(i-1,k);for(int j=1;j<=k;j++){for(int k=2;k<=i;k++){int s=sum[i]-sum[k-1];f[i][j]=max(f[k-1][j-1]*s,f[i][j]);}}}cout<<f[n][k]<<endl;}
樣例說明 (1+2+3)*4*5=120
總結