poj1651 区间dp

来源:互联网 发布:php 输出等边三角形 编辑:程序博客网 时间:2024/06/09 18:45

状态方程 :dp [i] [j] 是区间 [i , j] 已经全部取完,只剩下 i j所剩的最小代价。
状态转移 :dp [i][j] = min (dp [i][j], dp[i][k] + dp[k] [j] + a[i]*a[k]*a[j])

#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int INF=0x3f3f3f3f;int dp[105][105];int a[105];int main(){    int n;    while(~scanf("%d",&n))    {        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        memset(dp,0,sizeof(dp));        for(int len=2;len<n;len++)            for(int l=1;l+len-1<=n;l++)            {                int r=l+len-1;                dp[l][r]=INF;                for(int k=l;k<r;k++)                    dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+a[l-1]*a[k]*a[r]);            }        printf("%d\n",dp[2][n]);    }   } 
0 0