题目:即有一个长度为N的字符串,要求用M个乘号把它分成M+1个部分,使之乘积结果最大。
基础DP,找到状态转移方程:dp[i][j]=max(dp[i][j],dp[k][j-1]*data[k+1][j]);(此题目给定的范围较小,一旦变大的话需要用乘积爆出long long的话需要用数组存放数字较为麻烦)。
dp[i][j]是0-i个数字中插入j个乘号的最大值,data[i][j]即i-j数字的乘积总和,先给dp[i][0]=data[0][i]
由小到大,依次累积出最大。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
using namespace std;
char s[20];
int dp[20][20];
int data[20][20];
int main()
{
int M, N;
cin>>N>>M;
cin>>s;
memset(dp,0,sizeof(dp));
for(int i=0;i<N;i++)
{
int sum=0;
for(int j=i;j<N;j++)
{
sum=sum*10+s[j]-'0';
data[i][j]=sum;
}
}
for(int i=0;i<N;i++)
{
dp[i][0]=data[0][i];
}
for(int i=0;i<N;i++)
{
for(int j=1;j<=M;j++)
{
for(int k=0;k<i;k++)
{
dp[i][j]=max(dp[k][j-1]*data[k+1][i], dp[i][j]);
}
}
}
cout<<dp[N-1][M];
}