乘积最大

洛谷P1018 乘积最大

当时看到这个题很懵逼,暴力不好打,也不是很有效,dp也没思路。。然后看了题解。。f[i][j]表示在序列中前i个数中加入j个乘号的最大乘积,要在序列中枚举从j-1i的第j个乘号所在的位置,这里要前缀和优化,答案就是f[n][k]

#include<bits/stdc++.h>
using namespace std;
long long f[100][10];
char a[100];
long long num[100][100];
string s;
int n,k;
int main()
{
  cin>>n>>k;
  cin>>a;
  for(int i=1;i<=n;i++)
    num[i][i]=(int)a[i-1]-48;
  for(int i=1;i<n;i++)
    for(int j=i+1;j<=n;j++)
          num[i][j]+=num[i][j-1]*10+(int)a[j-1]-48;
  for(int i=1;i<=n;i++)
   f[i][0]=num[1][i];
    for(int i=1;i<=n;i++)
     for(int k1=1;k1<=k;k1++)
      {
          if(k1>=i)break;
          for(int j=k1;j<=i-1;j++)
        {
        f[i][k1]=max(f[i][k1],f[j][k1-1]*num[j+1][i]);
        }     
      } 
    cout<<f[n][k];    
  return 0;
}
原文地址:https://www.cnblogs.com/war1111/p/7375353.html