zoukankan      html  css  js  c++  java
  • POJ 1651 Multiplication Puzzle

    区间DP。dp[i][j]表示(i,j)开区间内全部取走的最小值。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    const int INF=0x7FFFFFFF;
    const int maxn=100+10;
    int a[maxn];
    int dp[maxn][maxn];
    int n;
    
    void init()
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dp[i][j]=INF;
        for(int i=1;i<=n;i++)
            if(i+2<=n)
                dp[i][i+2]=a[i]*a[i+1]*a[i+2];
    }
    
    void work()
    {
        for(int i=4;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                int st=j,en=st+i-1;
                if(en>n) continue;
                for(int s=st+1;s<=en-1;s++) //a[s]最后取走
                {
                    int now=0;
                    if(s-st>=2) now=now+dp[st][s];
                    if(en-s>=2) now=now+dp[s][en];
                    now=now+a[st]*a[s]*a[en];
                    dp[st][en]=min(dp[st][en],now);
                }
            }
        }
        printf("%d
    ",dp[1][n]);
    }
    
    int main()
    {
        while(~scanf("%d",&n))
        {
            for(int i=1;i<=n;i++) scanf("%d",&a[i]);
            init();
            work();
        }
        return 0;
    }
  • 相关阅读:
    day_07 深浅拷贝
    day_06 再谈编码
    day_05 字典
    day_04 列表
    day_03 字符串
    HDU 1049 Climbing Worm
    HDU 1720 A+B Coming
    Pascal向C++的跨越
    B-Boxes
    喵哈哈村的狼人杀大战(4)
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5215335.html
Copyright © 2011-2022 走看看