• 石子合并《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

    洛天依

  • 相关阅读:
    CentOS 7 修改国内yum源
    k8s 安装
    python2 python3同时安装了scrapy如何区分调用
    scrapy log 设置
    hello django
    linux 分割大文件
    scrapy 对不同的Item进行分开存储
    纯C实现的一套low b 贪吃蛇(娱乐版)
    Python之如何实现一行输入多个值
    HDU2571:命运(DP)
  • 原文地址:https://www.cnblogs.com/cctzhu/p/13152773.html
Copyright © 2020-2023  润新知