在一串数字中插入r个乘号,使得乘积最大

来源:互联网 发布:源码交易zhideyao 编辑:程序博客网 时间:2024/06/05 17:17

如 在847313926插入5个乘号,乘积最大为8*4*731* 3*9* 92*6

一般思路dp:

#include <iostream>#include <cstdio>#include <string>#include <cstring>using namespace std;int n;void show(long long c[][20],int r){   for(int i=1;i<=n;i++)   {      for(int j=0;j<=r;j++)      {         printf("%12I64d",c[i][j]);      }      cout<<endl;   }}int main(){    char  ch[20];    int  a[20];    int i,j,k;    int r;//插入乘号个数    long long f[20][20];    long long d;    while(1)    {       scanf("%s",ch);       scanf("%d",&r);       memset(f,0,sizeof(f));      n=strlen(ch);      if(n<=r)      {         cout<<"error"<<endl;         continue;      }      for(i=0;i<n;i++)      {           a[i+1]=(ch[i]-'0');      }      for(d=0,i=1;i<=n;i++)      {         d=d*10+a[i];         f[i][0]=d;      }      show(f,r);      int u;      for(k=1;k<=r;k++)//乘号个数,即列数,从1开始      for(i=k+1;i<=n;i++)//行数,从第二行开始      {        for(j=k;j<i;j++)//模拟新增的一个乘号所在位置j,范围[k,i)         {            for(d=0,u=j+1;u<=i;u++)               d=d*10+a[u];            if(f[i][k]<f[j][k-1]*d)               f[i][k]=f[j][k-1]*d;         }      }     show(f,r);    }    return 0;}








原创粉丝点击