当前位置: 代码迷 >> 综合 >> wikioi-1017 乘积最大
  详细解决方案

wikioi-1017 乘积最大

热度:4   发布时间:2023-12-19 11:17:22.0

设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。

做法:

map[i][j]: 从i到j组成的数

dp[j][k]: 从0到j,有k个乘号所得的值

dp[j][k]=max(dp[l][k-1]*map[l+1][k];


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int map[51][51];
int main()
{int n,m,i,j,k,t;char str[10001];cin>>n>>m;cin>>str;for(i=0;i<n;i++){int mm;mm=0;for(j=i;j<n;j++){mm=mm*10+str[j]-'0';map[i][j]=mm;}}int dp[51][10];memset(dp,0,sizeof(dp));for(j=0;j<n;j++)dp[j][0]=map[0][j];for(j=0;j<n;j++){for(k=1;k<=m;k++){for(t=0;t<j;t++){dp[j][k]=max(dp[t][k-1]*map[t+1][j],dp[j][k]);}}}cout<<dp[n-1][m]<<endl;return 0;
}