• 【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
    ", dfs(n, m));
        return 0;
    }
  • 相关阅读:
    URL
    B/S架构
    SQL查询语句
    SQL-Delete语句
    SQL运算符
    SQL结构查询语言
    SQL数据库数据类型详解
    标准文档流
    CSS
    字体样式
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626585.html
Copyright © 2020-2023  润新知