ZOJ 1602 Multiplication Puzzle

来源:互联网 发布:mac os 破解软件 编辑:程序博客网 时间:2024/04/29 22:49

区间dp

F(i, j) = min(F(i, k) + a[i]*a[k]*a[j] + F(k, j))


#include <cstdio>#include <cstring>using namespace std;#define N 103typedef long long LL;const long long inf = 1<<29;LL f[N][N], a[N];int n;LL dp(int l, int r) {    if (f[l][r] != inf) return f[l][r];    if (l + 2 > r) return f[l][r] = 0;    LL min = inf, tmp;    for (int k=l+1; k<r; k++) {        tmp = dp(l, k) + dp(k, r) + a[l]*a[k]*a[r];        if (tmp < min) min = tmp;    }    return f[l][r] = min;}int main() {    while (scanf("%d", &n) == 1) {        for (int i=1; i<=n; i++) scanf("%lld", &a[i]);        for (int i=1; i<=n; i++)            for (int j=1; j<=n; j++) f[i][j] = inf;        printf("%lld\n", dp(1, n));    }    return 0;}


原创粉丝点击