p1298(矩阵切割)dp

Shadow Shadow     2022-08-27     187

关键词:

题目:

给你一个矩阵,其边长均为整数。你想把矩阵切割成总数最少的正方形,其边长也为整数。切割工作由一台切割机器完成,它能沿平行于矩形任一边的方向,从一边开始一直切割到另一边。对得到的矩形再分别进行切割。
输入数据:
输入文件中包含两个正整数,代表矩形的边长,每边长均在1—100之间。
输出数据:
输出文件包含一行,显示出你的程序得到的最理想的正方形数目。
输入输出示例:
CUTS.IN:
5 6
CUTS.OUT:
5

这道题呢可以用DFS+记忆化搜索,因为正在学习DP,所以就用DP写了

所以就用一个数组f[i][j]表示边长为i,j的矩形可以分出最少的正方形

所以就可知if(i==j)  f[i][j]=1;      所以就可以知道状态转移方程为:f[i][j]=min{f[i][k1]+f[i][j-k1],f[k2][j]+f[i-k2][j]}

(这里面f[i][k1]+f[i][j-k1]表示将矩形横着切开以后分成的两块包含的最少的矩形,同理可得f[k2][j]+f[i-k2][j]是竖着切开后两块的最少矩形) 1<=k1<j; 1<=k2<i;

 

代码如下:

技术分享
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[2100][2100];
int a[2100][2100];
int main()
{
    int n,m;
    cin>>n>>m;
    memset(f,10,sizeof(f));
    f[0][0]=0;
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            a[i][j]=1;
            if(i==j)
                f[i][j]=1;
        }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            /*if(i==j)
                f[i][j]=1;*/
            int k1,k2;
            for(int k=1;k<j;k++)//横着切
            {
                k1=f[i][k]+f[i][j-k];
                if(k1<f[i][j])
                    f[i][j]=k1;
            }
            for(int k=1;k<i;k++)//竖着切
            {
                k2=f[k][j]+f[i-k][j];
                if(k2<f[i][j])
                    f[i][j]=k2;
            }
        }
    }
    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<f[i][j]<<‘ ‘;
        }
        cout<<endl;
    }*/
    cout<<f[n][m]<<endl;
    return 0;
}
View Code

 










洛谷p1298最接近的分数

P1298最接近的分数题目描述给出一个正小数,找出分子(非负)不超过M,分母不超过N(正数)的最简分数或整数,使其最接近给出的小数。“最接近”是指在数轴上该分数距离给出的小数最近,如果这个分数不惟一,输出“T... 查看详情

钢条切割-递归,记忆性递归,dp(代码片段)

钢条切割方法1:递归importjava.util.Scanner;publicclassCuttingpublicstaticintn=10;publicstaticint[]p=1,5,8,16,10,17,17,20,24,30;publicstaticintcut(intx)intres=0;if(x==0)return0; 查看详情

poj1191棋盘切割(压缩dp+记忆化搜索)

一,题意:中文题二。分析:主要利用压缩dp与记忆化搜索思想三,代码:#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>usingnamespacestd;constintBig=20000000;intMat[10] 查看详情

bailian4122切割回文dp(代码片段)

4122:切割回文总时间限制:1000ms内存限制:65536kB描述阿福最近对回文串产生了非常浓厚的兴趣。如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文串。例如,“abcaacba”是一个回文串,... 查看详情

poj8471切割回文dp北大acm/icpc竞赛训练(代码片段)

 1#include<iostream>2#include<vector>3#defineINF1000004usingnamespacestd;56strings;7chara[1005];8vector<int>hui[1005];//hui[i]里的k指k到i组成回文9intdp[1005];//dp[i]代表前i个字符要切几刀1011intma 查看详情

uva10003cuttingsticks区间dp

...p;problem=944  题目大意:给你一个长度为L的木条,和N个切割点,每次切割的代价是当前切割木条的长度,问最小代价是多少。  解题思路:很显然的区间DP,dp(i,j) 查看详情

codeforces757dfelicity'sbigsecretrevealed(状压dp)

题意:给定一个01串,一个有效的n切割定义如下:一个横杠代表一次切割,第一条横杠前面的01串不算,最后一条横杠后面的01串不算,将两个横杠中的01串转化成十进制数字,假设这些数字的最大值是MAX且这些数字囊括了1-MAX的... 查看详情

蓝桥杯:矩阵乘法(区间dp)

...[l][r]=min(dp[l][r],dp[l][k]*dp[k][r]+num[l]*num[k]*num[r]).表示用l*k的矩阵去和k*r的矩阵相乘,然后取最小。1 查看详情

[dp]矩阵的最小路径和

题目给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的树子累加起来就是路径和,返回所有的路径中最小的路径和.解法一这是一道经典的动态规划题,状态转移方程为dp[i][j]=min{dp[i-1][j],dp[i]... 查看详情

子矩阵(暴搜(全排列)+dp)

子矩阵(暴搜(全排列)+DP)一、题目子矩阵时间限制: 1Sec  内存限制: 128MB提交: 1  解决: 1[提交][状态][讨论版]题目描述给出如下定义:1.子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组... 查看详情

poj1191棋盘分割(区间dp,记忆化搜索)

...那一项和我们怎么分的具体方案无关,影响答案的是每个矩阵的矩阵和的平方,由于数据很小,我们可以预处理出每个矩阵的和的平方,执行状态转移。设dp[l1][r1][l2][r2][k]是矩阵l1,r1,l2,r2切割k次的最小值,我们可以枚举是横着切... 查看详情

矩阵快速幂优化dp模板

...s://blog.csdn.net/china_xyc/article/details/89819376#commentBox关于能用矩阵乘法优化的DP题目,有如下几个要求:转移式只有加法,清零,减法etc.,max和min运算不允许转移式中关于前几位dp结果得到的系数必须是常量转移次数一般超级多由于... 查看详情

hihocoder1580dp最大子矩阵和

题意:给出n*m的矩阵求最大子矩阵和,要求必须把矩阵中的某一个元素替换成p代码://求最大子矩阵和,容易想到压缩之后dp但是这道题要求必须替换一次p,必然优先替换最小的。//这样如果求得的结果恰好等于这个矩阵所有的... 查看详情

获取背包 DP 矩阵中选定项目的列表

】获取背包DP矩阵中选定项目的列表【英文标题】:GettinglistofselecteditemsinKnapsackDPmatrix【发布时间】:2016-10-0107:22:59【问题描述】:我已经尝试实现堆栈溢出AnsweredSolution。但它不起作用。测试用例:intval[]=10,40,30,50;intwt[]=5,4,6,3;W=1... 查看详情

hdu5607graph(矩阵优化+概率dp)

...到j点的概率。可是该题的k高达1e9。所以依照套路。要用矩阵相乘来优化。第一次写矩阵相乘。大概的意思就是利用矩阵实现递推。而且由于每次递推的过程一样,所以就相当于右乘这个矩阵的k次方。用矩阵高速幂就可以。矩阵... 查看详情

codeforcesround#341(div.2)e.wetsharkandblocks(矩阵优化dp)

...[j]*cnt[k],k是指枚举放1~9中哪一位。因为b特别大,显然要矩阵优化,知道了DP方程,其实矩阵的构造特别简单。 查看详情

(poj3744)scoutyyfi(概率dp+矩阵快速幂)

...为n个数字上限很大,所以常规的概率dp基本不可能,要用矩阵优化。把路程分成n+1段,分别计算通过每段的成功率,即刚好跨越地雷的概率(dp[地雷x+1])算好每段之后把每段的成功率相乘。(若有两颗地雷相邻那么成功率是0)#... 查看详情

noip2014pj子矩阵[搜索|dp]

题目描述给出如下定义:子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵。例如,下面左图中选取第2、4行和第2、4、5列交叉位置的元素得到一个2*3的... 查看详情