• 区间DP


    石子合并(一)

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
    描述
        有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
    输入
    有多组测试数据,输入到文件结束。
    每组测试数据第一行有一个整数n,表示有n堆石子。
    接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
    输出
    输出总代价的最小值,占单独的一行
    样例输入
    3
    1 2 3
    7
    13 7 8 16 21 4 18
    样例输出
    9
    239

    直接套了模版,本想着不对的竟然ac了。。。醉了
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define MAX 0xffffff
     4 #define min(x,y) x>y?y:x
     5 int main(){
     6     int stone[200],n,dp[200][200],sum[200];
     7     while(~scanf("%d",&n)){memset(dp,0,sizeof(dp));
     8     scanf("%d",&stone[0]);sum[0]=stone[0];
     9         for(int i=1;i<n;++i)scanf("%d",&stone[i]),sum[i]=stone[i]+sum[i-1];
    10             for(int i=n-2;i>=0;i--){
    11             for(int j=i+1;j<n;++j){dp[i][j]=MAX;}}
    12         for(int i=n-2;i>=0;i--){
    13             for(int j=i+1;j<n;++j){
    14                 for(int k=i+1;k<=j;++k){
    15                     dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k][j]+sum[j]-sum[i-1]);
    16                 }
    17             }
    18         }
    19     printf("%d
    ",dp[0][n-1]);    
    20     }
    21     return 0;
    22 }
  • 相关阅读:
    MongoClient类
    MongoDB基本操作(增删改查)
    为什么MongoDB适合大数据的存储?
    npm的使用
    nodejs安装教程
    c#byte数组和string类型转换
    C#中数组、ArrayList和List三者的区别
    eclspse魔板
    mysql的备份
    shell的使用
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4534990.html
Copyright © 2020-2023  润新知