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