【洛谷】P1388 算式(dp)
生活随笔
收集整理的這篇文章主要介紹了
【洛谷】P1388 算式(dp)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
給出N個數(shù)字,不改變它們的相對位置,在中間加入K個乘號和N-K-1個加號,(括號隨便加)使最終結果盡量大。因為乘號和加號一共就是N-1個了,所以恰好每兩個相鄰數(shù)字之間都有一個符號。例如:
N=5, K=2,5個數(shù)字分別為1、2、3、4、5,可以加成:
1*2*(3+4+5)=24
1*(2+3)*(4+5)=45
(1*2+3)*(4+5)=45
……
輸入輸出格式
輸入格式:
?
輸入文件共有二行,第一行為兩個有空格隔開的整數(shù),表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行為 N個用空格隔開的數(shù)字(每個數(shù)字在0到9之間)。
?
輸出格式:
?
輸出文件僅一行包含一個整數(shù),表示要求的最大的結果
最后的結果<=maxlongint
?
輸入輸出樣例
輸入樣例#1:?復制 5 2 1 2 3 4 5 輸出樣例#1:?復制 120-----------------------------------------------------------------------------
分析:一開始想用dp[i][j]表示i到j個數(shù)的最大值,可發(fā)現(xiàn)無論在循環(huán)上限還是其他地方都用不上k,然后我就看了題解這么想:在這題中,可以用dp[i][j]表示在前i個數(shù)中插入j個乘號。我們可以先處理前綴和,將dp[i][0]設為從a[1]加到a[i]的值,接著跑一個循環(huán),尋找位置,插入一個乘號。就這樣遞推就可以得出答案了。 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int dp[20][20],a[20]; 5 int main() 6 { 7 int x,n,k; 8 scanf("%d%d",&n,&k); 9 for(int i=1;i<=n;i++) 10 { 11 scanf("%d",&x); 12 a[i]=a[i-1]+x;//前綴和 13 dp[i][0]=a[i]; 14 } 15 for(int i=1;i<=n;i++) 16 for(int j=1;j<=min(k,i-1);j++) 17 { 18 for(int k=1;k<=i;k++) 19 dp[i][j]=max(dp[i][j],dp[k][j-1]*(a[i]-a[k])); 20 } 21 printf("%d",dp[n][k]); 22 return 0; 23 }
?
轉載于:https://www.cnblogs.com/noblex/p/7739696.html
總結
以上是生活随笔為你收集整理的【洛谷】P1388 算式(dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。