#include <iostream>
#include <sstream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stack>
#include <queue>
#include <set>
#include <math.h>
/*=======================================
矩陣連乘問題
dp(i, j) = min( dp(i, k) + dp(k + 1, j) + S);
i < k < j;
dp(i, i) = 0;
========================================*/
#define flush(arr, i) memset(arr, i, sizeof(arr))
typedef long long int64;
using namespace std;
const int MAX_ITEM = 128;
//const int oo = 0x7fffffff;
const int oo = 0x3f3f3f3f;
int dp[MAX_ITEM][MAX_ITEM];
int w[MAX_ITEM], pos[MAX_ITEM][MAX_ITEM];
int DP(int l, int r)
{
if(l == r)
return 0;
if(dp[l][r])
return dp[l][r];
int ans = oo, tmp = 0;
for(int i = l; i < r; i++)
{
tmp = DP(l, i) + DP(i + 1, r) + w[l - 1] * w[i] * w[r];
if(ans > tmp)
{
ans = tmp;
pos[l][r] = i;
}
}
return dp[l][r] = ans;
}
void display(int l, int r)
{
if(l == r)
{
printf("A%d", l);
return;
}
printf("(");
display(l, pos[l][r]);
display(pos[l][r] + 1, r);
printf(")");
}
int main()
{
freopen("0-data.txt", "r", stdin);
int n;
while(scanf("%d", &n) != EOF)
{
flush(dp, 0);
flush(pos, 0);
for(int i = 0; i <= n; i++)
scanf("%d", w + i);
printf("%d\n", DP(1, n));
display(1, n);
}
return 0;
}
區間DP-矩陣連乘問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.