[区间DP] Multiplication Puzzle POJ

来源:互联网 发布:网络棋牌游戏输赢原理 编辑:程序博客网 时间:2024/05/21 10:51
           [区间DP] Multiplication Puzzle POJ - 1651 

题目大意:给定一个数组,第一个数和最后一个数不能选,每次拿走一个数,得到的价值为该数字和左右相邻的三个数字的乘积,n-2次操作后,求最小的价值为多少。最小的价值定义为n-2次操作的累加和。
分析:首先想到区间DP,dp[i,j],定义为区间[i,j]的最小价值,对于每个区间,我们可以枚举最后取的那个值,dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+num[i-1]*num[k]*num[j]);
AC代码:

#include<stdio.h>#include<stdlib.h>#include<string>#include<string.h>#include<algorithm>#include<set>#include<map>#include<vector>#include<queue>#define MAX 999999999#define MIN -1#define ll long longusing namespace std;int main(){    int n;    while(~scanf("%d",&n))    {        int num[110];        for(int i=1;i<=n;i++)scanf("%d",&num[i]);        int dp[150][150];        memset(dp,0,sizeof(dp));        for(int len=2;len<n;len++)        {            for(int i=2;i+len<=n+1;i++)            {               int j=i+len-1;               dp[i][j]=MAX;               for(int k=i;k<j;k++)                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+num[i-1]*num[k]*num[j]);            }        }        printf("%d\n",dp[2][n]);    }    return 0;} 
原创粉丝点击