zoukankan      html  css  js  c++  java
  • AC日记——石子归并 codevs 1048

    1048 石子归并

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

    有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。

    输入描述 Input Description

    第一行一个整数n(n<=100)

    第二行n个整数w1,w2...wn  (wi <= 100)

    输出描述 Output Description

    一个整数表示最小合并代价

    样例输入 Sample Input

    4

    4 1 1 4

    样例输出 Sample Output

    18

    数据范围及提示 Data Size & Hint
     
     
     
    思路:
      区间dp(其实就是暴力枚举(毕竟这题数据太水(没办法(>.<))));
     
     
    来,上代码:
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    int n,dp[101][101][101],sum[101];
    
    int main()
    {
        scanf("%d",&n);
        memset(dp,127/3,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&dp[0][i][i]);
            sum[i]=sum[i-1]+dp[0][i][i];
            dp[0][i][i]=0;
        }
        for(int i=1;i<n;i++){for(int j=1;j<=n;j++) dp[i][j][j]=dp[0][j][j];}
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int r=j;r<=n;r++)
                {
                    dp[i][j][r]=min(dp[i][j][r],dp[i-1][j][r]);
                    for(int v=j;v<r;v++)
                    {
                        dp[i][j][r]=min(dp[i][j][r],dp[i-1][j][v]+dp[i-1][v+1][r]+sum[r]-sum[j-1]);
                    }
                }
            }
        }
        printf("%d
    ",dp[n-1][1][n]);
        return 0;
    }
  • 相关阅读:
    C#中任意类型数据转成JSON格式
    数据库用户映射到SQL Server登录名
    浅述WinForm多线程编程与Control.Invoke的应用
    Git错误一例
    提高VS2010/VS2012编译速度
    给有兴趣、有责任要讲课、分享的朋友推荐两本书
    中国剩余定理
    中国剩余定理
    洛谷1546 最短网路
    洛谷1111 修复公路
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6070262.html
Copyright © 2011-2022 走看看