题目:
http://poj.org/problem?id=1651
题意:
给出一段序列,删除除头尾的数字,每次删除ai的花费是ai-1*ai*ai+1,求出删除的最小花费。
思路:
dp[i][j] 表示i~j的最小花费。
dp[i][j] = min(dp[i][k] + dp[k][j] +ai*ak*aj 表示若k为最后取出的数字的话,则区间i~j的最小花费是多少。
据说这道题与矩阵链乘法相似=。=
AC.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int dp[105][105], a[105];
int main()
{
//freopen("in", "r", stdin);
int n;
while(~scanf("%d", &n)) {
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; ++i) {
for(int j = i-2; j >= 1; --j) {
for(int k = j+1; k < i; ++k) {
if(dp[i][j] != 0)
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]);
else dp[i][j] = dp[i][k]+dp[k][j]+a[i]*a[k]*a[j];
}
}
}
printf("%d\n", dp[n][1]);
}
return 0;
}