1. 程式人生 > >洛谷 P1324 矩形分割

洛谷 P1324 矩形分割

i++ 格式 輸入輸出格式 ostream names back tdi stream 需求

P1324 矩形分割

題目描述

出於某些方面的需求,我們要把一塊N×M的木板切成一個個1×1的小方塊。

對於一塊木板,我們只能從某條橫線或者某條豎線(要在方格線上),而且這木板是不均勻的,從不同的線切割下去要花不同的代價。而且,對於一塊木板,切割一次以後就被分割成兩塊,而且不能把這兩塊木板拼在一起然後一刀切成四塊,只能兩塊分別再進行一次切割。

現在,給出從不同的線切割所要花的代價,求把整塊木板分割成1×1塊小方塊所需要耗費的最小代價。

輸入輸出格式

輸入格式:

輸入文件第一行包括N和M,表示長N寬M的矩陣。

第二行包括N-1個非負整數,分別表示沿著N-1條橫線切割的代價。

第三行包括M-1個非負整數,分別表示沿著M-1條豎線切割的代價。

輸出格式:

輸出一個整數,表示最小代價。

輸入輸出樣例

輸入樣例#1: 復制
2 2
3
3
輸出樣例#1: 復制
9

說明

數據範圍:

對於60%的數據,有1 ≤ N ,M≤ 100;

對於100%的數據,有1 ≤ N,M ≤ 2000。

思路:動規+貪心 f[i][j]表示橫著切i刀,豎著切j刀的最小代價。
#include<cstdio>
#include
<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; int x[1010],y[2010]; long long f[2010][2010]; int cmp(int a,int b){ return a>b; } int main(){ scanf("%d%d",&n,&m); n-=1;m-=1; for(int i=1;i<=n;i++) scanf("%d",&x[i]);sort(x+1
,x+1+n,cmp); for(int i=1;i<=m;i++) scanf("%d",&y[i]);sort(y+1,y+1+m,cmp); for(int i=1;i<=n;i++) f[i][0]=f[i-1][0]+x[i]; for(int j=1;j<=m;j++) f[0][j]=f[0][j-1]+y[j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) f[i][j]=min(f[i-1][j]+x[i]*(j+1),f[i][j-1]+y[j]*(i+1)); cout<<f[n][m]; }

洛谷 P1324 矩形分割