1 条题解
-
0
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
- 上传者