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