tyvj 乘法游戏

来源:互联网 发布:java 隐式参数 编辑:程序博客网 时间:2024/05/16 06:35
思路:dp题,f[i][j]表示从i到j的最小值,先把f数组初始化为很大,求最小值,把f[i][j]分为i到k,和k到j两段区间,分解成小部分,得到动态转移公式
f[i][j]=min(f[i][j],f[i][k]+a[i]*a[k]*a[j]+f[k][j]);
#include<stdio.h>#include<string.h>#include<stdlib.h>const int INF=100000;int a[105];int f[105][105];int main(){    int n;    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++)    f[i][j]=INF;    for(int i=1;i<=n;i++)    f[i][i-1]=f[i][i]=f[i][i+1]=0;    for(int i=2;i<=n-1;i++)    f[i-1][i+1]=a[i-1]*a[i]*a[i+1];    for(int i=n-2;i>0;i--)    {        for(int j=i+2;j<=n;j++)        {            for(int k=i+1;k<j;k++)            {                if(f[i][j]>f[i][k]+a[i]*a[k]*a[j]+f[k][j])                f[i][j]=f[i][k]+a[i]*a[k]*a[j]+f[k][j];            }        }    }    printf("%d\n",f[1][n]);    return 0;}








0 0
原创粉丝点击