艺术馆的火灾
背景描述
这幢古老的建筑是一个艺术馆,它珍藏着上百件绘画、雕塑以及其他艺术品,就连建筑本身也是一件艺术。但是,岁月并不在乎它的精致与美丽,时光在渐渐剥夺着这幢木屋的生命。终于,在一个月色昏暗的夜晚,它着火了。
艺术馆是一幢两层的小楼,每一层有N个房间,每个房间中收藏的艺术品的价值都可以用一个正整数来表示。下面是一个N=4的例子。
在这个例子中,二层楼的第四个房间中艺术品的价值最大,为60。而一层楼的第四个房间中艺术品的价值仅为20。
在消防队员火速赶到的时候,火势已经蔓延了整个建筑,消防队员们观察每个房间中的火势,将它们分别用一个正整数来表示。在上面的例子中,各房间中的火势可能如下。
你可以看到,二层楼的第四个房间中火势最强,为70。而一层楼的第三个房间中火势较弱,为20。
由于火情紧急,消防队员们准备使用一种新型的灭火器。这种灭火器只能发射K次,每次发射将覆盖一个矩形的区域(矩形的高度可以是1也可以是2)。它的威力巨大,所到之处不但火焰会被扑灭,就连同在一处的艺术品也难以幸免。因此,如何善用这种灭火器成了最大的问题。
一个例子:如果灭火器的一次发射覆盖了下图阴影所示的2×2矩形区域,那么这四个房间的火势和艺术品价值都将成为0。
任务说明
给出艺术馆每层的房间数N和灭火器的发射次数K,以及每个房间中艺术品的价值和火势,你需要决定灭火器每次应该怎样发射(也可以不发射),才能将这次火灾的损失降到最低限度。这个损失用你所摧毁的艺术品的总价值,加上剩余的火势总值(这些火焰将需要消防队员们亲身去扑灭)来衡量。
输入数据
输入文件的第一行有两个整数N(1 <= N <= 100)、K(1 <= K <= 10),分别表示艺术馆中每层的房间数和灭火器的发射次数。
接下来的两行每行有N个整数,其中第4-i行的第j个整数Vi,j表示的是第i层第j个房间中艺术品的价值(1 <= i <= 2,1 <= j <= N,1 <= Vi,j <= 10000)。
再接下来的两行每行也有N个整数,其中第6-i行的第j个整数Fi,j表示的是第i层第j个房间中的火势(1 <= i <= 2,1 <= j <= N,1 <= Fi,j <= 10000)。
输出数据
计算最小的损失。
样例输入:
4 1
40 50 30 60
30 30 40 20
50 40 50 70
40 50 20 30
4 2
40 50 30 60
30 30 40 20
50 40 50 70
40 50 20 30
4 3
40 50 30 60
30 30 40 20
50 40 50 70
40 50 20 30
4 4
40 50 30 60
30 30 40 20
50 40 50 70
40 50 20 30
4 5
40 50 30 60
30 30 40 20
50 40 50 70
40 50 20 30
4 1
40 50 30 60
30 30 40 200
50 40 50 70
40 50 20 30
3 1
10 30 10
10 10 30
30 10 30
30 30 10
样例输出:
300
290
280
270
270
320
100
题意: 在一个2*N的矩阵中选取K个子矩阵, 使得损失最小. 子矩阵的大小可以使1*L or 2*L, 其中1和2
解题思路: (想了2天, 终于想明白!!!)
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 105
const int INF = (1<<29);
int n, K;
int val[3][MAX], f[3][MAX];
int dp[12][MAX][5];
int result;
inline int min(int a, int b)
{
}
int getLoss(int i, int j) //0:上下不用, 1:上用, 2:下用, 3:灭火器覆盖最少1个小矩形, 4:覆盖至少2个矩形
{
}
int DP(int k, int i, int j)
{
}
int main()
{
//
}