1 条题解

  • 0
    @ 2025-2-14 21:20:40

    C :

    #include<stdio.h>
    #include<string.h>
    #define N 20
    int len, m, num[N];//num【】来存放第几个空位的位置
    long long d[N][N];//存放第i个空位和第j个空位之间数字是多少
    long long ans, sum;//sum是当前的结果
    char a[N];//输入
    void cal()
    {
    	sum = 1;
    	int x, y;
    	int i;
        for(i = 1; i <= m; i++)   //遍历到最后一个空格之后,设定最后一个空格就是最后一个数字之后
    	{
    		x = num[i-1];
    	   	y = num[i];
    		sum *= d[x][y];
    	}
    }
    void dfs(int p, int l)
    {
    	int i;
    	int x, y;
    	if(l > m-1)   //多于m-1个符号,return
    	{
    		cal();
    		ans = sum > ans ? sum : ans;
    		return;
    	}
    	else
    		for(i = p; i < len; i++)   //空位的可能情况是1 ~ len-1
    		{
    			num[l] = i;
    			dfs(i+1, l+1);
    		}
    }
    int main()
    {
    	int T;
    	int i, j;
    	scanf("%d", &T);
    	while(T--)
    	{
    		ans = 0;
    		memset(d, 0, sizeof(d));
    		scanf("%s%d",a,&m);
    		if(m == 1)      //剪枝,如果没有乘号那么输出的原数
    		{ puts(a); continue; }
    		len = strlen(a);
    		num[m] = len;   //最后一个空格就是最后一个数字之后
    		for(i = 0; i < len; i++)
    			for(j = i + 1; j <= len; j++)
    			{
    				if(j == i + 1) d[i][j] = a[i] - '0';
    				else d[i][j] = d[i][j-1] * 10 + a[j-1] - '0';  //第2个空位对应的字母是a【2-1】
    			}
    		dfs(1, 1);
    		printf("%lld\n", ans);
    	}
    	return 0;
    }
    
    

    C++ :

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<ctime>
    #include<cmath>
    #include<string>
    #include<cstdio>
    using namespace std;
    
    typedef unsigned long long ULL;
    
    char s[30]; int len;
    ULL ans;
    
    ULL getNum(int i, int j) {
        ULL res = 0;
        for(int k = i; k <= j; ++k) res = res * 10 + s[k] - '0';
        return res;
    }
    
    void dfs(int pos, int m, ULL res) {
        //cout<<pos<<"--"<<m<<"--"<<res<<endl;
        if(m == 0) {
            ans = max(ans, res * getNum(pos, len-1));
            return;
        }
        for(int i = pos; i <= len; ++i)
            if(len - i - 1 >= m)
            dfs(i+1, m-1, res * getNum(pos, i));
    }
    
    int main() {
        int T, m;
        scanf("%d", &T);
        while(T--) {
            ans = 0;
            scanf("%s %d", s, &m);
            len = strlen(s);
            m--;
            if(m == 0) { cout<<s<<endl; continue; }
            for(int i = 0; i < len; ++i)
                if(len - i - 1>= m)
                dfs(i+1, m-1, getNum(0, i));
            cout<<ans<<endl;
        }
        return 0;
    }
    
    

    Java :

    import java.util.Scanner;
    
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		int t = in.nextInt();
    		while (t-- > 0) {
    			String s = in.next();// 用字符串的方式输入,方便预处理
    			s = '0' + s;
    			int m = in.nextInt();
    			// 进行预处理,用a[i][j]表示原来第i到j段的数值
    			int ok = 1;
    			long[][] a = new long[s.length()][s.length()];
    			for (int i = 1; i < s.length(); i++) {
    				if (s.charAt(i) == '0')
    					ok = 0;
    				for (int j = i; j < s.length(); j++) {// 是要从i开始
    					a[i][j] = a[i][j - 1] * 10 + s.charAt(j) - '0';
    				}
    			}
    			if (ok == 0 && s.length() - 1 == m || s.length() - 1 < m) {
    				System.out.println(0);
    				continue;
    			}
    			// f[][]表示这个数前i位分成j段的最大乘积
    			long[][] f = new long[s.length()+1][s.length()+1];
    			// f[i][j] = f[k][j-1]*a[k+1,i];(0<k<i<s.length(),j<m)
    			for (int i = 1; i < s.length(); i++)
    				f[i][1] = a[1][i];
    			long ans = 0;
    //			if (m == 1)
    //				ans = f[s.length() - 1][1];
    			for (int j = 2; j <= m; j++) {//第j个乘号
    				for (int i = j; i < s.length(); i++) {
    				//	ans = a[i][i];
    					// f[i][j] = a[0][s.length()-1-i];
    					// System.out.println("a:"+a[0][s.length()-1-i]);
    					for (int k = 1; k < i; k++) {
    						f[i][j] = Math.max(f[i][j], f[k][j - 1] * a[k + 1][i]);
    						// if(ans<f[i][j])
    						// ans = f[i][j];
    					}
    				}
    			}
    			System.out.println(f[s.length() - 1][m]);
    		}
    	}
    }
    
    
    • 1

    信息

    ID
    792
    时间
    1000ms
    内存
    64MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者