https://codeforces.com/contest/1198/problem/D

原来是dp的思路,而且是每次切成两半向下递归。好像在哪里见过类似的,貌似是紫书的样子。

再想想好像就很显然的样子,并不会出现奇奇怪怪的合并的样子。

#include<bits/stdc++.h>
using namespace std; const int INF = 0x3f3f3f3f; int dp[51][51][51][51];
char g[51][51]; int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int n;
while(~scanf("%d", &n)) {
for(int i = 1; i <= n; ++i)
scanf("%s", g[i] + 1);
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
dp[i][j][i][j] = (g[i][j] == '#');
}
}
for(int h = 1; h <= n; ++h) {
for(int w = 1; w <= n; ++w) {
if(w == 1 && h == 1)
continue;
for(int i = 1; i <= n; ++i) {
if(i + h - 1 > n)
break;
for(int j = 1; j <= n; ++j) {
if(j + w - 1 > n)
break;
int &tmp = dp[i][j][i + h - 1][j + w - 1] = max(h,w);
for(int k = i; k < i + h - 1; ++k) {
tmp = min(tmp, dp[i][j][k][j + w - 1] + dp[k + 1][j][i + h - 1][j + w - 1]);
}
for(int k = j; k < j + w - 1; ++k) {
tmp = min(tmp, dp[i][j][i + h - 1][k] + dp[i][k + 1][i + h - 1][j + w - 1]);
}
}
}
}
}
printf("%d\n", dp[1][1][n][n]);
}
}

最新文章

  1. Python基础四
  2. C#多线程的异步委托/调用
  3. 适可而止:YAGNI原则
  4. C#对多个集合和数组的操作(合并,去重,判断)
  5. JAVASE笔记回顾
  6. AngularJS 1.5.0-beta.2 and 1.4.8 have been released
  7. spring aop配置及用例说明(4)
  8. Oracle/Mysql/SqlServer函数区别
  9. markdown流程图
  10. MVC验证09-使用MVC的Ajax.BeginForm方法实现异步验证
  11. 自己开发轻量级ORM(二)
  12. (转)让浏览器支持Webp
  13. 【死磕Java并发】-----Java内存模型之happens-before
  14. LeetCode(21. 合并两个有序链表)
  15. &#39;An instance 0x155e74a0 of class UIWebView was deallocated while key value observers were still registered with it.
  16. Openstack1 云计算与虚拟化概念
  17. Gym 101873C - Joyride - [最短路变形][优先队列优化Dijkstra]
  18. CocosCreator资源工作流程
  19. mui做的苹果app生成ipa后放到自己的网站上让人下载安装
  20. Kettle 4.2源码分析第二讲--Kettle插件结构体系简介

热门文章

  1. SpringBoot整合redis把用户登录信息存入redis
  2. 【BZOJ1488】[HNOI2009]图的同构计数
  3. CSS盒模型面试知识点
  4. mysql OR运算符 语法
  5. pages
  6. 【bzoj2733】[HNOI2012]永无乡
  7. Leetcode 16. 3Sum Closest(指针搜索)
  8. 一本通&amp;&amp;洛谷 ——靶型数独——题解
  9. 贪心整理&amp;一本通1431:钓鱼题解
  10. 测试常用linux命令1