博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1298(矩阵切割)DP
阅读量:4677 次
发布时间:2019-06-09

本文共 1143 字,大约阅读时间需要 3 分钟。

题目:

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

输入数据:
输入文件中包含两个正整数,代表矩形的边长,每边长均在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
#include
#include
#include
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
View Code

 

转载于:https://www.cnblogs.com/lcyhaha/p/6682269.html

你可能感兴趣的文章
前端MVC实践之hellorocket——by张舒彤
查看>>
OptimalSolution(2)--二叉树问题(3)Path路径问题
查看>>
IPC 之 Messenger 的使用
查看>>
爱情八十六课,等得不是爱情
查看>>
企业网站建设流程
查看>>
数据库的显示、创建、使用 、用户授权管理及忘记root用户后重置密码
查看>>
ES5和ES6中的继承 图解
查看>>
macos 下usb键盘问题.
查看>>
SQL函数学习(十六):STUFF()函数
查看>>
node上传包到npm公共库
查看>>
CI CLI执行方式
查看>>
robotframework API 源码阅读笔记----robot.utils.asserts
查看>>
201521123092《Java程序设计》第七周学习总结
查看>>
[翻译]JWA(JEDI Windows API Headers)库的readmefirst.txt文件翻译
查看>>
秒杀系统(二)
查看>>
day23---ajax跨域解决---JSONP
查看>>
redis封装 get查询/删除key/keys查询
查看>>
移动端自适应js
查看>>
Pro Android学习笔记(三二):Menu(3):Context菜单
查看>>
java中用StringBuffer写文件换行
查看>>