古人云:「不謀萬世者,不足謀一時;不謀全域性者,不足謀一域。」張琪曼通過研究驚奇地發現,每個人一生的幸福指數可以用乙個長度為n的十進位制數字字串來表示,並且可以通過全域性統籌安排,將幸福指數分成k+1個部分應用在她感興趣的不同領域,從而使得總體幸福值最強,所謂幸福值最強,是指使得k個部分的乘積為最大。例如n=6,k=3,且數字字串為「310143」時,此時可能有的情況有下列各種:
3×1×0×143=0
3×1×01×43=129
3×1×014×3=126
3×10×1×43=1290
3×10×14×3=1260
3×101×4×3=3630
31×0×1×43=0
31×01×4×3=372
310×1×4×3=3720
從上面的結果可以看出,最大乘積為310×1×4×3=3720。
現在的問題時,當n,數字串和k給出之後,找出一種分法使其乘積為最大。
輸入第一行為兩個整數,即n和k, 6≤n≤40,1≤k≤6
第二行為數字字串。
輸出乙個整數,即最大乘積。
樣例輸入
樣例輸出6 3
310143
3720
初次看到這個題目感覺像普通區間dp,然後發現是稍加變形的類似揹包的問題。
定義dp[i][j]為前i個數插入j個乘號所得到的最大乘積,然後可以得出前i個數的乘積為最後乙個乘號插入位置m之前的dp[m][j-1]乘上最後乙個乘號插入之後的i-m個數組成的整數,由此可得狀態轉移方程dp[i][j]=max(dp[i][j],dp[m][[j-1]*getnum(m,i)),getnum(m,i)為第m個數到第i個數組成的整數。
ac**如下:(不過我後來發現用long long陣列儲存可能在超過1e19的數字後會溢位,但是題目竟然過了,看來題目資料還是比較友好的哈)
#includeusing namespace std;
char s[41];
int num[41];
long long dp[41][7]=;
void chartoint(char s,int num)
return;
}long long getnum(int i,int j)
return thisnum;
}int main()}}
cout
}
《動態規劃》 乘積最大
今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用k個乘號將它分成...
乘積最大 動態規劃
今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用k個乘號將它分成...
乘積最大問題 動態規劃
洛谷p1018 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用...