POJ-1651 Multiplication Puzzle(区间dp)

来源:互联网 发布:apache与php关系 编辑:程序博客网 时间:2024/05/22 03:24

题意:给出一组数,每删除一个数的代价是其左右两边的数与该数连乘的数值,求除了首尾两个数之外,删除中间所有数的最小代价是多少。

思路:区间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;}

继续加油~

原创粉丝点击