POJ 1651 Multiplication Puzzle

来源:互联网 发布:css3 javascript 编辑:程序博客网 时间:2024/04/29 14:18

又弱弱地发一个博客,写完就睡觉,本题是一个动态规划的题目,转移方程为 d[i][j]=min(d[i][k]+d[k][j]+a[i]*a[k]*a[j]);  i<k<j,k表示i和j之间最后一个被拿走的数

#include <iostream>#include <cstdio>using namespace std;int n;const int maxn=100;const int inf=(1<<31)-1;//最大有符号int型整数int a[maxn],d[maxn][maxn];int main(){    scanf("%d",&n);    for(int i=0;i<n;i++)        scanf("%d",&a[i]);    for(int i=0;i<n;i++)        for(int j=0;j<n;j++)            d[i][j]=inf;    for(int i=0;i<=n-3;i++)        d[i][i+2]=a[i]*a[i+1]*a[i+2];//对三个数的进行预处理    for(int i=0;i<=n-2;i++)        d[i][i+1]=0;    for(int s=3;s<n;s++)        for(int i=0,j=i+s;j<=n-1;i++,j++)            for(int k=i+1;k<j;k++)              d[i][j]=min(d[i][j],d[i][k]+d[k][j]+a[i]*a[k]*a[j]);    printf("%d\n",d[0][n-1]);    return 0;}


原创粉丝点击