zoukankan      html  css  js  c++  java
  • 石子合并《1》

    题目描述

    N堆石子排成一排(n<=100),现要将石子有次序地合并成一堆,规定每次只能选相邻的两堆合并成一堆,并将新的一堆的石子数,记为改次合并的得分,编一程序,由文件读入堆数n及每堆石子数(<=200);

    (1)选择一种合并石子的方案,使得做n-1次合并,得分的总和最少

    (2)选择一种合并石子的方案,使得做n-1次合并,得分的总和最多

    输入格式

    第一行为石子堆数n

    第二行为每堆石子数,每两个数之间用一空格分隔。

    输出格式

    从第1行为得分最小第二行是得分最大。

    样例

    样例输入

    4
    4 5 9 4
    

    样例输出

    44
    54
    

    今天过了几道题~~

     1 //CCTzhu 2020-6-17
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 const int maxn=110;
     5 const int inf=0x3f3f3f3f;
     6 int f1[maxn][maxn],f2[maxn][maxn],sum[maxn];
     7 int main(){
     8     int n;
     9     memset(f2,inf,sizeof(f2));//要求最小值,提前初始化;
    10     scanf("%d",&n);
    11     for(int i=1;i<=n;i++){
    12         scanf("%d",&sum[i]);
    13         sum[i]+=sum[i-1];
    14         f2[i][i]=0;//注意下面for循环要用f[i][i]实际上是不能自己和自己合并的;
    15     }
    16     for(int d=2;d<=n;d++){//枚举长度
    17         for(int i=1,j;(j=i+d-1)<=n;i++){
    18             for(int k=i;k<j;k++){
    19                 f1[i][j]=max(f1[i][j],f1[i][k]+f1[k+1][j]+sum[j]-sum[i-1]);
    20                 f2[i][j]=min(f2[i][j],f2[i][k]+f2[k+1][j]+sum[j]-sum[i-1]);//----|>得益于上面的初始化;
    21             }
    22         }
    23     }
    24     printf("%d
    %d
    ",f2[1][n],f1[1][n]);
    25     return 0;
    26 }
    View Code

    洛天依

  • 相关阅读:
    ZOJ 2588 Burning Bridges
    POJ 1966 ZOJ 2182 Cable TV Network
    HDU 5348 MZL's endless loop
    HDU 5352 MZL's City
    Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
    ZOJ 1119 SPF
    HDU 3452 Bonsai
    HDU 1520 Anniversary party
    POJ 2239 Selecting Courses
    POJ 1144 Network
  • 原文地址:https://www.cnblogs.com/cctzhu/p/13152773.html
Copyright © 2011-2022 走看看