poj1651解题报告

题目大意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积。直到只剩下首尾两个数为止。问最小得分是多少?

解题思路:用dp,转化为矩阵链乘问题,但要注意最后一前一尾两个数不能算进去,所以处理起来还是好一定的差别!!!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=(1<<30);
const int maxn=100+50;
int f[maxn][maxn],p[maxn],n;
int main()
{
        scanf("%d",&n);
        for(int i=0;i<n;i++)
                scanf("%d",&p[i]);
                memset(f, 0, sizeof(f));
                for (int len = 2;len < n; len++)
                for (int i= 0; i + len < n; i++)
                {
                int j=i+len;
                f[i][j] = INF;
                        for(int k = i + 1; k < j; k++)
                        f[i][j] = min(f[i][j], f[i][k] + f[k][j] + p[k] * p[i] * p[j]);
                }
                printf("%d\n",f[0][n-1]);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值