原题

LRJ入门经典-0903切蛋糕305
难度级别:B; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B
试题描述

如图所示有一个矩形蛋糕,上面划分成了n行m列的网格,一些网格内放着樱桃。现在要根据如下规则切蛋糕:

1.切开的每一块必须是矩形(包括正方形)

2.切蛋糕时必须沿着网格线,不能拐弯

3.切开的每一块蛋糕上有且仅有一个樱桃

下图是一种切割方法:

这种方法需要切割的边数为2+4=6

以下是另一种切割方法:

这种方法需要切割的边数为3+2=5

现在给定蛋糕的形状和上面樱桃的分布,要求求出切割边数最少的方案。

输入
第一行包含三个正整数n,m和k(1<=n,m<=20),k表示樱桃数量
以下k行每行包含两个正整数,表示每个樱桃所在的行和列
输出
输出最优方案的切割边数
输入示例
3 4 3
1 2
2 3
3 2
输出示例
5

分析

第一眼看到“(1<=n,m<=20)”就想到了DFS,但普通的DFS显而易见会超时,只能用记忆化搜索了。

dp[i1][j1][i2][j2]代表坐标为(i1,j1)的点与坐标为(i2,j2)的点围成的长方形蛋糕,将其切成蛋糕上有且仅有一个樱桃时的最小切割边数。(初值为-1)

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,k,a[21][21],dp[21][21][21][21];
inline int check(int x1,int y1,int x2,int y2)
{
int sum=0;
for(int i=x1;i<=x2;i++)
for(int j=y1;j<=y2;j++)
if(a[i][j]) sum++;
return sum;
}
inline int dfs(int x1,int y1,int x2,int y2)
{
int &d=dp[x1][y1][x2][y2];
if(d>-1) return d;
int sum=check(x1,y1,x2,y2);
if(sum==0) return d=1000000;
if(sum==1) return d=0;
int minn=1000000;
for(int i=x1;i<x2;i++)
minn=min(minn,dfs(x1,y1,i,y2)+dfs(i+1,y1,x2,y2)+(y2-y1+1));
for(int i=y1;i<y2;i++)
minn=min(minn,dfs(x1,y1,x2,i)+dfs(x1,i+1,x2,y2)+(x2-x1+1));
return d=minn;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
a[x][y]=1;
}
memset(dp,-1,sizeof(dp));
printf("%d",dfs(1,1,n,m));
}

  

LRJ入门经典-0903切蛋糕305的更多相关文章

  1. LRJ入门经典-0906最短公共父串305

    原题 LRJ入门经典-0906最短公共父串305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 给定字符串A和字符串B,要求 ...

  2. LRJ入门经典-0905邮票和信封305

    原题 LRJ入门经典-0905邮票和信封305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 假定一张信封最多贴5张邮票,如 ...

  3. LRJ入门经典-0907万圣节的小L306

    原题 LRJ入门经典-0907万圣节的小L306 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 今天是万圣节,小L同学开始了 ...

  4. C++语言学习——LRJ入门经典笔记

    1.scanf的输入格式,空格.TAB和回车符都是无关紧要,所以按Enter键并不意味着输入结束. 告诉程序输入结束的方式: 在windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再 ...

  5. 强烈推荐visual c++ 2012入门经典适合初学者入门

    强烈推荐visual c++ 2012入门经典适合初学者入门 此书循序渐进,用其独特.易于理解的教程风格来介绍各个主题,无论是编程新手,还是经验丰富的编程人员,都很容易理解. 此书的目录基本覆盖了Wi ...

  6. <Node入门经典>读书笔记

    最近在读<Node入门经典>, 之前没有做笔记, 今天开始把看过自己又写了的代码放这里以免忘记. express var express = require('express') var ...

  7. 正经学C#_介绍与其编写基础:《c#入门经典》

    本文所讲内容,均可在<c#入门经典>中可以查询.如有错误,敬请指出.谢谢! C#:全称C Shar.是微软.Net Framework平台下最为主要的客户语言之一.个人理解,c#是微软最为 ...

  8. SQL入门经典(十) 之事务

    事务是什么?事务关键在与其原子性.原子性概念是指可以把一些事情当作一个执行单元来看待.从数据库角度看待.他是指应该全部执行或者全部不执行一条或多条语句的最小组合.当处理数据时候经常确保一件事发生另一件 ...

  9. 《Web编程入门经典》

    在我还不知道网页的基础结构的时候,我找过很多本介绍Web基础的书籍,其中这本<Web编程入门经典>,我认为是最好的. 这本书内容很全面.逻辑很严谨.结构很清晰.语言文字浅显易懂. 看这本书 ...

随机推荐

  1. Codeforces Round #271 (Div. 2) 解题报告

    题目地址:http://codeforces.com/contest/474 A题:Keyboard 模拟水题. 代码例如以下: #include <iostream> #include ...

  2. linux程序设计——个人总结

    linux程序设计--个人总结 到今天为止,<linux程序设计>学习基本完毕了.从五月下旬開始接触linux,学习安装Ubuntu14.04,六月份開始学习<linux程序设计&g ...

  3. 【Struts2二】结果集(result-type)

    在jsp/servlet中,结果集一般是指请求转发和重定向这两种. Struts2作为框架,提供了基于这两种的很多其它的结果集! 在struts-default.xml中定义了一些默认的结果集:   ...

  4. MySql创建指定字符集的数据库

    以创建字符集为utf8的数据库为例: CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREAT ...

  5. Android--Fragment与Activity通信

    package com.example.testfragment; import com.example.testfragment.MainFargment.BackString; import an ...

  6. ListView的setOnItemClickListener回调不能执行的解决

    如果ListView中的单个Item的view中存在checkbox,button等view,会导致ListView.setOnItemClickListener无效,事件会被子View捕获到,Lis ...

  7. 什么是Monad?

    为了理解什么是Monad,最好需要了解什么是Monoid.这两篇互为姐妹篇,因为Monad的定义是:A monad is just a monoid in the category of endofu ...

  8. CentOS 7.4 安装 网易云音乐

    CentOS 7.4 安装 网易云音乐 本文包含: 安装dnf 编译gcc 5.4.0 安装各种包 安装网易云音乐贯穿全局; 安装环境: CentOS 7.4, kernel3.10.0, gcc4. ...

  9. 每位 Ubuntu 18.04 用户都应该知道的快捷键

    作者: Abhishek Prakash 译者: LCTT XiatianSummer 了解快捷键能够提升您的生产力.这里有一些实用的 Ubuntu 快捷键助您像专业人士一样使用 Ubuntu. 您可 ...

  10. NodeJS学习笔记 (21)事件机制-events(ok)

    模块概览 events模块是node的核心模块之一,几乎所有常用的node模块都继承了events模块,比如http.fs等. 模块本身非常简单,API虽然也不少,但常用的就那么几个,这里举几个简单例 ...