poj 1651 Multiplication Puzzle(裸区间dp)

来源:互联网 发布:淘宝号注册马上注册 编辑:程序博客网 时间:2024/05/17 08:16

题意:一系列的数字,除了头尾不能动,每次取出一个数字,这个数字与左右相邻数字的乘积为其价值,最后将所有价值加起来,要求最小值。
思路:典型的区间dp问题。

#include<cstdio>#include<algorithm>using namespace std;int dp[110][110],a[110];const int inf=0x7ffffff;int main(){   int n;   while(~scanf("%d",&n)){      for(int i=1;i<=n;i++) scanf("%d",&a[i]);      for(int i=1;i<=n;i++){        for(int j=1;j<=n;j++){            dp[i][j]=inf;        }      }      for(int i=1;i<n;i++) dp[i][i+1]=0;      for(int i=3;i<=n;i++){        for(int j=i-2;j>=1;j--){          for(int k=j+1;k<i;k++){              dp[j][i]=min(dp[j][i],dp[j][k]+dp[k][i]+a[j]*a[k]*a[i]);          }        }      }      printf("%d\n",dp[1][n]);   }}
0 0
原创粉丝点击