【t004】切割矩阵

来源:互联网 发布:自动卸载软件 编辑:程序博客网 时间:2024/06/16 08:35

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;}
0 0
原创粉丝点击