题意:给出一组数,每删除一个数的代价是其左右两边的数与该数连乘的数值,求除了首尾两个数之外,删除中间所有数的最小代价是多少。
思路:区间dp。与http://blog.csdn.net/yo_bc/article/details/75028461有异曲同工之妙。
Code:
#include <algorithm>
#include <string.h>
#include <cstdio>
using namespace std;
const int maxn = 105;
int value[maxn];
int dp[maxn][maxn];
int main()
{
int t, n;
while(scanf("%d", &n) != EOF)
{
for(int i = 1; i <= n; ++i) scanf("%d", &value[i]);
memset(dp, 0x3f, sizeof dp);
for(int i = 2; i < n; ++i) dp[i][i] = value[i]*value[i-1]*value[i+1];
for(int len = 2; len < n-1; ++len)
for(int i = 2; i < n-len+1; ++i)
{
int j = i+len-1;
for(int k = i; k <= j; ++k)
{
if(k == i) dp[i][j] = min(dp[i][j], dp[k+1][j]+value[k]*value[i-1]*value[j+1]);
else if(k == j) dp[i][j] = min(dp[i][j], dp[i][k-1]+value[k]*value[i-1]*value[j+1]);
else dp[i][j] = min(dp[i][j], dp[i][k-1]+dp[k+1][j]+value[k]*value[i-1]*value[j+1]);
}
}
printf("%d\n", dp[2][n-1]);
}
return 0;
}
继续加油~