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;
}

  

posted @ 2011-08-06 15:30  zqynux  阅读(2667)  评论(0编辑  收藏  举报