题目传送门

直接暴力定义f[x1][y1][x2][y2]是使对角为\((x1, y1),(x2, y2)\)这个子矩形满足要求的最短切割线长度

因为转移顺序不好递推,采用记忆化搜索

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
LL read() {
    LL k = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9')
      k = k * 10 + c - 48, c = getchar();
    return k * f;
}
int f[21][21][21][21], sum[21][21];
bool mapp[21][21];
int dp(int x1, int y1, int x2, int y2) {
    int num = sum[x2][y2] - sum[x1-1][y2] - sum[x2][y1-1] + sum[x1-1][y1-1];
    if(num == 1) return f[x1][y1][x2][y2] = 0;
    if(num == 0) return f[x1][y1][x2][y2] = 2147483647 / 3;

    if(f[x1][y1][x2][y2] != -1) return f[x1][y1][x2][y2];

    f[x1][y1][x2][y2] = 2147483647 / 3;
    for(int i = x1; i < x2; ++i)
        f[x1][y1][x2][y2] = min(dp(i+1, y1, x2, y2) + dp(x1, y1, i, y2) + abs(y1 - y2) + 1, f[x1][y1][x2][y2]);
    for(int i = y1; i < y2; ++i)
        f[x1][y1][x2][y2] = min(dp(x1, y1, x2, i) + dp(x1, i+1, x2, y2) + abs(x1 - x2) + 1, f[x1][y1][x2][y2]);
    return f[x1][y1][x2][y2];
}
int n, m, k;
void solve(int tot) {
    memset(f, -1, sizeof(f));
    memset(mapp, 0, sizeof(mapp));
    for(int i = 1; i <= k; ++i) {
        int x = read(), y = read();
        mapp[x][y] = 1;
    }
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + mapp[i][j];
    dp(1, 1, n, m);
    printf("Case %d: %d\n", tot, f[1][1][n][m]);
}
int main() {
    int tot = 0;
    while(scanf("%d %d %d", &n, &m, &k) != EOF)
        solve(++tot);
    return 0;
}

最新文章

  1. Using Internal EEPROM of PIC Microcontroller
  2. C++STL算法函数总结
  3. 一天一小段js代码(no.2)
  4. IOS路线图
  5. Python基础(9)--正则表达式
  6. 简单的分页sql
  7. ie9以上浏览器input文本框/密码框后面的小叉子/小眼睛问题
  8. JS~JS里的数据类型
  9. step_by_step_G+入门-在线服务
  10. App Doc View Frame中指针的获取
  11. SVN报E155024: Invalid relocation destination
  12. (八)控件介绍,QLable
  13. Asp.Net Core 实现服务的批量注册注入
  14. openstack-ntp时间同步服务
  15. java 安装教程
  16. 使用 Zabbix 监控 Jenkins
  17. nginx 前端POST请求405问题解决与排查过程
  18. js获取子节点和修改input的文本框内容
  19. Git初级使用教程
  20. 3.keras实现--&gt;高级的深度学习最佳实践

热门文章

  1. 测试之美 Part 1
  2. Unity 动画系统目录
  3. Java文件与io——RandomAccessFile
  4. Java NIO基本使用介绍
  5. Python编程实现USB转RS485串口通信
  6. vulhub-php/php_inclusion_getshell
  7. C#中接口的深入浅出【转】
  8. 《C#高效编程》读书笔记05-为类型提供ToString()方法
  9. log4net 最快速体验
  10. 多个activity之间的数据共享