zoukankan      html  css  js  c++  java
  • TYVJ P1094 矩形分割 标签:DP

    做题记录:2016-08-12 21:42:21

    背景

    YHOI Train#4 Problem 1

    描述

    出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块。
    对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价。而且,对于一块木板,切割一次以后就被分割成两块,而且不能把这两块木板拼在一起然后一刀切成四块,只能两块分别再进行一次切割。
    现在,给出从不同的线切割所要花的代价,求把整块木板分割成1×1块小方块所需要耗费的最小代价。

    输入格式

    输入文件第一行包括N和M,表示长N宽M的矩阵。
    第二行包括N-1个非负整数,分别表示沿着N-1条横线切割的代价。
    第二行包括M-1个非负整数,分别表示沿着M-1条竖线切割的代价。

    输出格式

    输出一个整数,表示最小代价。

    测试样例1

    输入

    2 2 

    输出

    9

    备注

    对于60%的数据,有1 ≤ N ,M≤ 100;
    对于100%的数据,有1 ≤ N,M ≤ 2000。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int N,M;
    int heng[2005],shu[2005],f[2005][2005];//拼音大法好 
    bool cmp(int a,int b){
        return a>b;
    }
    
    void init_(){
        scanf("%d%d",&N,&M);
        for(int i=1;i<N;i++) scanf("%d",&heng[i]);
        for(int i=1;i<M;i++) scanf("%d",&shu[i]);
        sort(heng+1,heng+N+1,cmp);
        sort(shu+1,shu+M+1,cmp);
        for(int i=1;i<=N;i++) f[i][0]=f[i-1][0]+heng[i];
        for(int i=1;i<=M;i++) f[0][i]=f[0][i-1]+shu[i];
    }
    
    int main(){
    //    freopen("01.txt","r",stdin);
        init_();
        for(int i=1;i<N;i++){
            for(int j=1;j<M;j++){//横行i已经多少刀 竖行j已经多少刀 
                f[i][j]=min(f[i-1][j]+heng[i]*(j+1),f[i][j-1]+shu[j]*(i+1));
            }
        }
        printf("%d
    ",f[N-1][M-1]);
        return 0;
    }

    将横分割线和竖分割线分别按大至小快排一遍。
    记发f[i][j]表示切了前i条横分割线,前j条横分割线的最小代价。

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    微信分享接口
    MySQL的语句执行顺序
    C++类内存分布
    static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
    c++内存中字节对齐问题详解
    msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍
    使用valgrind检查内存
    GDB调试教程
    Linux一些经典书籍
    C++编程语言学习资料
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5766675.html
Copyright © 2011-2022 走看看