-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathP1018.c
117 lines (108 loc) · 3.27 KB
/
P1018.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 40
#define maxk 7
typedef char *big_int;
static big_int dp[maxn][maxn][maxk];
static big_int num;
static big_int sub(int l, int r) {
size_t len = r - l + 1;
char *s = (char *)malloc((len + 1)*sizeof(char));
strncpy(s, num + l, len);
s[len] = '\0';
return s;
}
static big_int mul(big_int a, big_int b) {
if (a == NULL || b == NULL) {
printf("这个分支不会被执行~~~~");
char *res = (char *)malloc(2 * sizeof(char));
res[0] = '0';
res[1] = '\0';
return res;
}
size_t a_len = strlen(a);
size_t b_len = strlen(b);
unsigned char *val = (unsigned char *)malloc((a_len + b_len) * sizeof(unsigned char));
memset(val, 0, (a_len + b_len) * sizeof(unsigned char));
for (int i = a_len - 1; i >= 0; i--)
for (int j = b_len - 1; j >=0 ;j--) {
val[i + j + 1] += (a[i] - '0')*(b[j] - '0');
val[i + j] += val[i + j + 1] / 10;
val[i + j + 1] %= 10;
}
int index = 0;
while (index < a_len + b_len && val[index] == 0)
index++;
if (index == a_len + b_len) index--;
char *res = (char *)malloc((a_len + b_len - index + 1)*sizeof(char));
for (int i = index; i < a_len + b_len; i++)
res[i - index] = val[i] + '0';
res[a_len + b_len - index] = '\0';
free(val);
return res;
}
static big_int max(char *a, char *b) {
if (a == NULL)
return b;
if (b == NULL)
return a;
size_t a_len = strlen(a);
size_t b_len = strlen(b);
if (a_len > b_len)
return a;
else if (a_len < b_len)
return b;
for (int i = 0; i < a_len; i++) {
if (a[i] > b[i])
return a;
else if (a[i] < b[i])
return b;
}
return a;
}
static void print(big_int a) {
printf("%s\n", a);
}
int main() {
int n, k;
scanf("%d %d", &n, &k);
k++;
num = (char *)malloc(n*sizeof(char));
scanf("%s", num);
int len, l, r, t, mt, m, t1, mt1, mt2;
for (len = 1; len <= n; len++)
for (l = 0; l < n - len + 1; l++) {
r = l + len - 1;
dp[l][r][1] = sub(l, r);
mt = len < k ? len : k;
for (t = 2; t <= mt; t++)
for (m = l; m < r; m++) {
mt1 = (m - l + 1) < t - 1 ? (m - l + 1) : t - 1;
mt2 = (r - m) < t - 1 ? (r - m) : t - 1;
for (t1 = 1; t1 <= mt1; t1++) {
if (t - t1 > mt2) continue;
big_int a = mul(dp[l][m][t1], dp[m + 1][r][t - t1]);
big_int b = dp[l][r][t];
dp[l][r][t] = max(a, b);
if (dp[l][r][t] == a) {
if (b != NULL)
free(b);
}
else {
free(a);
}
}
}
}
free(num);
print(dp[0][n - 1][k]);
for (len = 1; len <= n; len++)
for (l = 0; l < n - len + 1; l++) {
r = l + len - 1;
mt = len < k ? len : k;
for (int t = 1; t < mt; t++)
free(dp[l][r][t]);
}
exit(0);
}