当前位置: 首页 > news >正文

【t004】切割矩阵

Time Limit: 1 second
Memory Limit: 50 MB

【问题描述】
给你一个矩阵,其边长均为整数。你想把矩阵切割成总数最少的正方形,其边长也为整数。切割工作由一台切割机器完成,它能沿平行于矩形任一边的方向,从一边开始一直切割到另一边。对得到的矩形再分别进行切割。

【输入】

共1行;
输入文件中包含两个正整数,代表矩形的边长,每边长均在1—100之间。

【输出】

包含1行,输出文件包含一行,显示出你的程序得到的最理想的正方形数目。

【输入样例】

5 6

【输出样例1】

5

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t004

【题意】

【题解】

/*
    设f[i][j]表示长为i,宽为j的时候分割成的最小正方形个数;
    记忆化搜索;
    在搜的时候强制限制一下x>y
    //时间复杂度感觉应该是O(n^3)的吧。
    dfs(int x,int y)
    {
        if (x==y)
            return 1;
        if (x==1||y==1)
            return max(x,y);
        //竖切
        rep1(i,1,x-1)
            {
                int temp = dfs(i,y)+dfs(x-i,y);
                if (temp<f[x][y])
                    f[x][y] = temp;
            }
        //横切
        rep1(i,1,y-1)
        {
            int temp = dfs(x,i)+dfs(x,y-i);
            if (temp < f[x][y])
                f[x][y] = temp;
        }
        return f[x][y];
    }
*/


【完整代码】

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define rei(x) scanf("%d",&x)
#define rep1(i,x,y) for (int i = x;i <= y;i++)

const int N = 110;

int n, m;
int f[N][N];

int dfs(int x, int y)
{
    if (f[x][y] < 0x3f3f3f3f)
        return f[x][y];
    if (x == y)
        return 1;
    if (x == 1 || y == 1)
        return max(x, y);
    //竖切
    rep1(i, 1, x - 1)
    {
        int temp = dfs(max(i,y),min(i,y)) + dfs(max(x-i,y),min(x - i, y));
        if (temp<f[x][y])
            f[x][y] = temp;
    }
    rep1(i, 1, y - 1)
    {
        int temp = dfs(max(x,i),min(x, i)) + dfs(max(x,y-i),min(x, y - i));
        if (temp < f[x][y])
            f[x][y] = temp;
    }
    return f[x][y];
}

int main()
{
    //freopen("D:\\rush.txt", "r", stdin);
    //freopen("D:\\rush_out.txt", "w", stdout);
    rei(n), rei(m);
    memset(f, 0x3f3f3f3f, sizeof f);
    if (n < m)
        swap(n, m);
    printf("%d\n", dfs(n, m));
    return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626585.html

相关文章:

  • idea中构建maven项目时控制台乱码的解决办法
  • 【record】10.30..11.6
  • 跳跃表原理和实现
  • 【Linux】命令——网络管理
  • python初学-元组、集合
  • 读Zepto源码之Fx模块
  • JS_dom_自定义对象
  • [CQOI 2010]扑克牌
  • 判断是否为汉字
  • 编程感悟
  • Oracle 重启监听
  • iOS 静默拍照!!!
  • 指定网卡ping另外的网卡
  • 4 Median of Two Sorted Arrays(medium)
  • jdk8 stream可以与list,map等数据结构互相转换
  • canvas 高仿 Apple Watch 表盘
  • DataBase in Android
  • ES6系统学习----从Apollo Client看解构赋值
  • ES6语法详解(一)
  • Git的一些常用操作
  • JAVA并发编程--1.基础概念
  • nodejs:开发并发布一个nodejs包
  • Vue全家桶实现一个Web App
  • Windows Containers 大冒险: 容器网络
  • 从重复到重用
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 计算机在识别图像时“看到”了什么?
  • 理解在java “”i=i++;”所发生的事情
  • 浅谈Golang中select的用法
  • 手机app有了短信验证码还有没必要有图片验证码?
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #{} 和 ${}区别
  • #微信小程序(布局、渲染层基础知识)
  • (1) caustics\
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (52)只出现一次的数字III
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十)T检验-第一部分
  • (一)基于IDEA的JAVA基础12
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .dwp和.webpart的区别
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core Swagger 过滤部分Api
  • .Net 代码性能 - (1)
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET委托:一个关于C#的睡前故事
  • @RequestMapping-占位符映射
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • []T 还是 []*T, 这是一个问题