题意:

给出一个 n∗nn*nn∗n 的网格,其中有一些为黑,有一些为白。现在将一块 w∗hw*hw∗h 的区域全部涂成白色的花费是 max(w,h)max(w,h)max(w,h),问将整个区域全部涂成白色的最少花费是多少?(1≤n≤50)(1\leq n\leq 50)(1≤n≤50)


思路:

无论是从题干还是从数据范围,都可以比较明显地看出这是一道 DPDPDP。而 DPDPDP 问题最关键的就是状态怎么定,如果状态定对了,问题将迎刃而解。

比赛时的思路是 dp[i][j]dp[i][j]dp[i][j] 表示从 (1,1)(1,1)(1,1) 到 (i,j)(i,j)(i,j) 的区域全部涂成白色的最少花费。但是不知道如何转移这个状态,属于那种脑袋晕晕没有思路的状态,然后就放弃了…现在想想,当时发现状态没有很好的转移思路的时候,应该要及时更换思路,不能一条路走死了。

赛后知道了正确的状态应该是 dp[x1][y1][x2][y2]dp[x_1][y_1][x_2][y_2]dp[x1​][y1​][x2​][y2​],表示将 (x1,y1)(x_1,y_1)(x1​,y1​) 到 (x2,y2)(x_2,y_2)(x2​,y2​) 的区域全部涂成白色的最少花费。转移就直接横纵枚举网格分割点,记忆化搜索即可。


总结:

DPDPDP 的问题就是这样,想不出状态或想错状态的时候觉得这个问题真难,搞懂之后就开始嫌这题怎么简单,我当时怎么没做出来…(哭

反思一下的话,这题犯了两个比较明显的错误。第一个是一开始定完状态之后,发现不好转移然后没有再继续思考,而是直接放弃。缺乏状态定错进行转换的能力!

第二个是没有深挖题干。nnn 只有 505050,结果上来就只定一个二维状态,可真是浪费这么小的空间,犯了不仔细研究数据范围的大忌。这里必须再插一句,ACM\text{ACM}ACM 的世界里,题干和数据范围是非常重要的,没有数据范围空谈解决方法是极其不明智的,因此不充分利用好数据范围的信息,不根据数据范围来估算时间空间复杂度,属实属于 zzzzzz 行为。

50−O(n5),102−O(n4),500−O(n3),103−O(n2logn),104−O(n2),105/106−O(nlogn)50-O(n^5),10^2-O(n^4),500-O(n^3),10^3-O(n^2logn),10^4-O(n^2),10^5/10^6-O(nlogn)50−O(n5),102−O(n4),500−O(n3),103−O(n2logn),104−O(n2),105/106−O(nlogn)


代码:

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i = a; i <= b; i++)
const int N = 50+10;
using namespace std;int n,sum[N][N],dp[N][N][N][N];
char s[N][N];int dfs(int x1,int y1,int x2,int y2){if(dp[x1][y1][x2][y2] != -1) return dp[x1][y1][x2][y2];int cnt = sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];if(cnt == 0) return (dp[x1][y1][x2][y2] = 0);int ans = max(y2-y1+1,x2-x1+1);rep(i,y1,y2-1){int t1 = dfs(x1,y1,x2,i);int t2 = dfs(x1,i+1,x2,y2);ans = min(ans,t1+t2);}rep(i,x1,x2-1){int t1 = dfs(x1,y1,i,y2);int t2 = dfs(i+1,y1,x2,y2);ans = min(ans,t1+t2); }return (dp[x1][y1][x2][y2] = ans);
}int main()
{scanf("%d",&n);rep(i,1,n) scanf("%s",s[i]+1);rep(i,1,n)rep(j,1,n){sum[i][j] = sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];if(s[i][j] == '#') sum[i][j]++; //黑色块个数}memset(dp,-1,sizeof dp);printf("%d\n",dfs(1,1,n,n));return 0;
}

【Codeforces Round #576 (Div. 2)】Rectangle Painting 1【记忆化搜索】相关推荐

  1. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  2. Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索

    Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec  Memory Limit: 512 MB Submit: xxx  ...

  3. Codeforces Round #233 (Div. 2)D. Painting The Wall 概率DP

                                                                                   D. Painting The Wall ...

  4. Codeforces Round #576 (Div. 2) B. Water Lily

    很简单的数学题没啥好说的- 下面是AC代码? #include <bits/stdc++.h> using namespace std;int main() {double h, l;ci ...

  5. AtCoder Grand Contest 012 B Splatter Painting(记忆化搜索)

    题意: 给一个包含N个顶点,M条边,无自环和重边的简单无向图,初始每个点颜色都为0,每条边的长度为1,连接着ai,bi两个节点.经过若干个操作, 每次将与某个点vi距离不超过di的所有点染成某种颜色c ...

  6. Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心

    Codeforces Round #297 (Div. 2)C. Ilya and Sticks Time Limit: 2 Sec  Memory Limit: 256 MB Submit: xxx ...

  7. Codeforces Round #700 (Div. 1Div. 2)

    Codeforces Round #700 (Div. 1&&Div. 2) 题号 题目 知识点 A Yet Another String Game 签到 B The Great He ...

  8. Codeforces Round #700 (Div. 2)A~D2解题报告

    Codeforces Round #700 (Div. 2)A~D2解题报告 A Yet Another String Game 原题链接 http://codeforces.com/contest/ ...

  9. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  10. Codeforces Round #662 (Div. 2) B. Applejack and Storages

    Codeforces Round #662 (Div. 2) B. Applejack and Storages 题目链接 This year in Equestria was a year of p ...

最新文章

  1. 开挂的 00 后!17 岁「天才少女」被 8 所世界名校录取,最终选择 MIT 计算机系...
  2. [文章集合] 在Windows Server 2012上关于Vmware的几点
  3. python流程图-使用Graphviz快速绘制流程图
  4. 输入两个整数a和b,计算a+b的和
  5. IDEA系列(十)--新建一个项目后之前的项目不显示
  6. form 多个submit php,一个复杂的PHP表单处理方案?
  7. 数据结构--选择排序
  8. boost::hana::detail::has_duplicates用法的测试程序
  9. boost::detail::allocator模块的测试程序
  10. mysql双机热备实现
  11. python中的str方法和repr方法_Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些
  12. Delphi 7连接MySql 5 5 15
  13. 2021-07-07IF神经元模型
  14. Android开发笔记(序)写在前面的目录
  15. 微信“拍一拍”新增“炸一炸”功能;爱奇艺 CEO:会费涨价是行业必然趋势;微软终止 Windows 10X 开发|极客头条...
  16. JVM之类的加载与类加载器
  17. MATLAB-阶乘运算
  18. 内网渗透技术之超越LLMNR/NBNS欺骗的ADIDNS欺骗攻击
  19. ONLYoffice在线编辑的接口测试
  20. c++ 崩溃 正则表达式regex_C++正则表达式regex初探及踩的坑

热门文章

  1. opencl JAVA编程_《OpenCL异构并行编程实战》第十二至十四章
  2. 千图成像_两分钟教你玩转千图成像Part1~
  3. 小知识--windows下的电脑关机注销等命令
  4. eplan窗口宏与符号宏是什么_如何使用EPLAN里的宏值集?
  5. 【UVA11059】Maximum Product(set+set默认从大到小排列---水题)
  6. matlab剪切板中内容清除,如何清空剪贴板内容?剪切板内容清理过程
  7. 用Neo4j图形数据库打造专属于你的高bigger关系图
  8. 载winpcap4.1.1_搞不清电力电缆载流量?有这一份最新汇总就够了~
  9. Windows10视频文件服务器启动失败,Win10安全中心服务启动失败的解决方法
  10. 二分从查找(2)按条件查找