NOIP 2000 乘积最大 解题报告
f[i][j]代表j个乘号, 前i位数的最大值, 转移方程式: f[i][j] = max{f[k][j - 1] + num[k + 1][i]} (1 <= k < i),num[i][j]代表第i位数到第j位数组成的数字是多少。
代码如下:
#include <stdio.h> #include <stdlib.h> typedef unsigned long long bignum; bignum f[41][31]; bignum num[41][41]; char str[42]; #define max(a, b) ((a)>(b)?(a):(b)) int main(int argc, char **argv) { int i, j, l; int n, k; scanf("%d%d", &n, &k); scanf("%s", &str[1]); for(i = 1; i <= n; i++){ for(j = i; j <= n; j++){ num[i][j] = num[i][j - 1] * 10 + str[j] - '0'; } } for(i = 1; i <= n; i++){ f[i][0] = num[1][i]; } for(j = 1; j <= k; j++){ for(i = 2; i <= n; i++){ for(l = 1; l < i; l++){ f[i][j] = max(f[i][j], f[l][j - 1] * num[l + 1][i]); } } } printf("%I64d\n", f[n][k]); return 0; }