问题标题: 酷町堂:1227:0分

0
0
已解决
屠永乐
屠永乐
高级守护
高级守护
#include<bits/stdc++.h>
using namespace std;
long long f[101][101];
int m,len,a[101];
char n[101];
long long cut(int x,int y){
    int s=0,k=1;
    for(int i=x;i<=y;i++){
        s+=a[i]*k;
        k=k*10;
    }
    return s;
}
int main()
{
    int t;
    cin>>t;
    for(int l=1;l<=t;l++)
    {
        cin>>n;cin>>m;
        len=strlen(n);
        for(int i=1;i<=len;i++)
        a[i]=n[i-1]-'0';
        memset(f,0,sizeof(f));
        for(int i=1;i<=len;i++)
        f[i][0]=cut(1,i);
        for(int i=2;i<=len;i++)
        for(int j=1;j<=min(i-1,m-1);j++)
        for(int k=j;k<=i-1;k++)
        f[i][j]=max(f[i][j],f[k][j-1]*cut(k+1,i));
        cout<<f[len][m-1]<<endl;
    }
    return 0;
}

0
已采纳
程之行
程之行
高级守护
高级守护

创建二维数组 f[][] ,用 f[i][j] 表示前 i 位数包含 j 个乘号所能达到的最大乘积

  • 将 i 从 2 到 n 枚举,表示分割为前i位数字
  • 对每一次分割再次将 a 从 1 到 min(i-1,k) 枚举,表示前 i 位中含有 a 个乘号
  • 将 b 从 a 到 i - 1 进行一次枚举,表示前 i 位中含有 a 个乘号,且最后一个乘号的位置在 b 处。那么当最后一个乘号在 b 处时最大值为前 b 位中含有 a - 1 个乘号的最大值乘上 b 处之后的数字
  • 因此得出了状态转移方程 f[i][a] = max(f[i][a] , f[b][a-1] * cut(b + 1,i)) 
    ——(cut(b + 1,i) 表示 b + 1 到 i 位数字)
  • //核心代码如下
  •   for(int j=1;j<=lenth;j++)
                g[j]=n[j-1]-'0';
            for(int j=1;j<=lenth;j++)
                f[j][0]=cut(1,j);
            for(int j=2;j<=lenth;j++)
                for(int a=1;a<=min(j-1,m-1);a++)
                    for(int b=a;b<=j-1;b++)
                        f[j][a]=max(f[j][a],f[b][a-1]*cut(b+1,j));
            cout<<f[lenth][m-1]<<endl;
  • 前面还有一段把字符转换数字的小函数,就由你来完成了,祝你最后ac
  • 望采纳,谢谢
0
0
0
0
吕牧原
吕牧原
高级守护
高级守护
  • 前面还有一段把字符转换数字的小函数,就由你来完成了,祝你最后ac
我要回答