http://wikioi.com/problem/1017/
划分型动态规划
1.转移方程是:f[i][j]=max(f[k][j-1]*t[k+1][i]),f[i][j]表示前面i个字符加上j个乘号所得的最大值,t[i][j]表示i到j的数值;
2.可预处理,先计算出每段的数字值;
3.看代码分析错误实在不行时,还是debug一下吧。
#include <cstring>
#include <iostream>
#define ulong long long
using namespace std;
ulong t[45][45]; // number from i to j; start from 0;
ulong f[45][10]; // the first i digits, seperated to j part, max value;
int data[45] = {0};
int main()
{
int n, k;
cin >> n >> k;
memset(t, 0, sizeof(t));
memset(f, 0, sizeof(f));
// input
char c;
for (int i = 0; i < n; i++)
{
cin >> c;
data[i] = c - '0';
t[i][i] = data[i];
}
// pre-process
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
t[i][j] = t[i][j-1]*10 + data[j];
}
}
// dp
for (int j = 0; j <=k ; j++)
{
for (int i = j+1; i <= n; i++)
{
if (j == 0)
{
f[i][0] = t[0][i-1];
}
else
{
ulong max = 0;
for (int x = 1; x < i; x++)
{
ulong tmp = f[x][j-1] * t[x][i-1];
if (tmp > max) max = tmp;
}
f[i][j] = max;
}
}
}
cout << f[n][k] << endl;
return 0;
}