【洛谷】P1388 算式(dp)
生活随笔
收集整理的這篇文章主要介紹了
【洛谷】P1388 算式(dp)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
給出N個(gè)數(shù)字,不改變它們的相對(duì)位置,在中間加入K個(gè)乘號(hào)和N-K-1個(gè)加號(hào),(括號(hào)隨便加)使最終結(jié)果盡量大。因?yàn)槌颂?hào)和加號(hào)一共就是N-1個(gè)了,所以恰好每?jī)蓚€(gè)相鄰數(shù)字之間都有一個(gè)符號(hào)。例如:
N=5, K=2,5個(gè)數(shù)字分別為1、2、3、4、5,可以加成:
1*2*(3+4+5)=24
1*(2+3)*(4+5)=45
(1*2+3)*(4+5)=45
……
輸入輸出格式
輸入格式:
?
輸入文件共有二行,第一行為兩個(gè)有空格隔開的整數(shù),表示N和K,其中(2<=N<=15, 0<=K<=N-1)。第二行為 N個(gè)用空格隔開的數(shù)字(每個(gè)數(shù)字在0到9之間)。
?
輸出格式:
?
輸出文件僅一行包含一個(gè)整數(shù),表示要求的最大的結(jié)果
最后的結(jié)果<=maxlongint
?
輸入輸出樣例
輸入樣例#1:?復(fù)制 5 2 1 2 3 4 5 輸出樣例#1:?復(fù)制 120-----------------------------------------------------------------------------
分析:一開始想用dp[i][j]表示i到j(luò)個(gè)數(shù)的最大值,可發(fā)現(xiàn)無(wú)論在循環(huán)上限還是其他地方都用不上k,然后我就看了題解這么想:在這題中,可以用dp[i][j]表示在前i個(gè)數(shù)中插入j個(gè)乘號(hào)。我們可以先處理前綴和,將dp[i][0]設(shè)為從a[1]加到a[i]的值,接著跑一個(gè)循環(huán),尋找位置,插入一個(gè)乘號(hào)。就這樣遞推就可以得出答案了。 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 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/noblex/p/7739696.html
總結(jié)
以上是生活随笔為你收集整理的【洛谷】P1388 算式(dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。