poj1651,区间dp

来源:互联网 发布:帝国cms绑定二级域名 编辑:程序博客网 时间:2024/06/10 16:44

区间dp

dp[i][j]表示i,j区间内最小乘积和。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int dp[105][105],a[105];int dfs(int le,int ri){    int i;//    printf("*%d %d %d\n",le,ri,dp[le][ri]);    if(dp[le][ri]!=-1)        return dp[le][ri];    if(le==ri-1)    {        dp[le][ri]=0;        return 0;    }    dp[le][ri]=dfs(le,le+1)+dfs(le+1,ri)+a[le]*a[ri]*a[le+1];    for(i=le+1;i<ri;i++)        if(dfs(le,i)+dfs(i,ri)+a[le]*a[ri]*a[i]<dp[le][ri])        {            dp[le][ri]=dp[le][i]+dp[i][ri]+a[le]*a[ri]*a[i];        }//    printf("#%d %d %d\n",le,ri,dp[le][ri]);    return dp[le][ri];}int main(){    int n,i,j,k,l;    while(scanf("%d",&n)!=EOF)    {        for(i=1;i<=n;i++)            scanf("%d",&a[i]);        memset(dp,-1,sizeof(dp));        dfs(1,n);        printf("%d\n",dp[1][n]);//        for(i=1;i<=n;i++)//            for(j=1;j<=n;j++)//            printf("%d %d %d\n",i,j,dp[i][j]);    }    return 0;}


0 0
原创粉丝点击