zoukankan      html  css  js  c++  java
  • NOI 1995 石子合并

    NOI 1995 石子合并

    洛谷传送门

    JDOJ传送门

    Description

    在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

    试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。

    Input

    包含两行,第1 行是正整数n(1<=n<=100),表示有n堆石子。

    第2行有n个数,分别表示每堆石子的个数。

    Output

    输出两行。

    第1 行中的数是最小得分;第2 行中的数是最大得分。

    Sample Input

    4 4 4 5 9

    Sample Output

    43 54


    题解:

    区间DP入门题。

    讲解走这边:

    浅谈区间DP

    中间需要一个小技巧,断环成链(不是图论的那个)(大雾

    然后在二倍区间上跑一个前缀和方便维护每次合并的价值。

    需要注意的是DP初态,最小值(dp1[i][i])的初态是0,因为单个无法合并。

    所以在二倍区间上区间DP,最后再统计一遍答案即可。

    代码:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn=210;
    const int INF=1e9;
    int n;
    int a[maxn],sum[maxn],dp1[maxn][maxn],dp2[maxn][maxn];
    int ans1,ans2;
    int main()
    {
        scanf("%d",&n);
        memset(dp1,0x3f,sizeof(dp1));
        ans1=INF;
        ans2=-INF;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a[n+i]=a[i];
        }
        for(int i=1;i<=n*2;i++)
            dp1[i][i]=0;
        for(int i=1;i<=n*2;i++)
            sum[i]=sum[i-1]+a[i];
        for(int len=2;len<=n;len++)
            for(int i=1;i<=n*2-len+1;i++)
            {
                int j=i+len-1;
                for(int k=i;k<j;k++)
                {
                    dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+(sum[j]-sum[i-1]));
                    dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+1][j]+(sum[j]-sum[i-1]));
                }
            }
        for(int i=1;i<=n;i++)
        {
            ans1=min(ans1,dp1[i][i+n-1]);
            ans2=max(ans2,dp2[i][i+n-1]);
        }
        printf("%d
    %d",ans1,ans2);
        return 0;
    }
    
  • 相关阅读:
    一些链接
    svn
    the source attachment does not contain the source for the file StrutsPrepareAndExecuteFilter.class
    hibernate学习
    hibernate
    mysql front查看所有数据库
    SSD: Single Shot MultiBox Detector 论文解读,附代码
    YOLO算法-论文笔记
    Deep Learning菜鸡篇,我的第一个深度神经网络
    小白成长之路:初识python(六) --python线程池
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13807558.html
Copyright © 2011-2022 走看看