乘法最大 動態規劃
阿新 • • 發佈:2018-12-18
給一個長度為 nn 的數字串,只包含數字0-9
,現在讓你在這個串中間插入 k 個乘號,將數字串分為 k+1個部分,使得這 k+1個數字的乘積最大。比如數字串為"312"
,k=1 的時候有 2 種插入方法。3∗12=36和 31∗2=62,所以答案為 62。
試程式設計求解"98712365409451502137"
中插入 10個乘號的最大乘積。注意答案超過了 int 的範圍,需要用到 long long 型別。由於結果太大,使用 Java 的同學建議用字串的方式輸出。
#include<iostream> #include<cstring> using namespace std; const int maxn=50; char s[maxn]; long long ans[maxn][15]; int n,k; long long change(int x,int y) { long long ret=0; for(int i=x;i<=y;i++) { ret=ret*10+(s[i]-'0'); } return ret; } void dp() { for(int i=1;i<=k;i++) for(int j=1;j<=n;j++) for(int m=1;m<=j;m++) if(ans[m][i-1]*change(m+1,j)>ans[j][i]) ans[j][i]=ans[m][i-1]*change(m+1,j); } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { cin>>s[i]; ans[i][0]=change(1,i); } dp(); printf("%lld\n",ans[n][k]); return 0; }