解题思路:利用动态规划的思想,这里的状态即是蛋糕的上线、下线、左线、右线。然后进行记忆化搜素。遍历竖着切的每一种方式和横着切的每一种方式最终得到结果。状态转移方程稍微有些繁琐,在这里就不列举了,可以直接看代码理解。
题目大意:给定一个方形蛋糕,上面有一些樱桃,现在可以对该蛋糕做切割处理,保证切出来的每一份小蛋糕上都有一个樱桃,且切割线的总长度最小。
Sample Input
3 4 3
1 2
2 3
3 2
Sample Output
Case 1: 5
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf = 1 << 30;
int n, m, k, dp[51][51][51][51]; //蛋糕尺寸和樱桃数目,以及dp数值
bool mark[51][51]; //为true即表示该位置放有樱桃
int sum(int s, int x, int z, int y) //此函数用来统计尺寸蛋糕内樱桃的数目
{
int ret = 0;
for (int i = x; i <= s; i++)
{
for (int j = z; j <= y; j++)
{
if (mark[i][j] == true) ret++;
}
}
return ret;
}
int f(int s, int x, int z, int y)
{
int &ans = dp[s][x][z][y];
if (ans != -1) return ans;
int cherr